【问题标题】:Is it possible to configure the temp file folder in git diff?是否可以在 git diff 中配置临时文件夹?
【发布时间】:2018-10-19 07:19:59
【问题描述】:

当在存储库中调用git difftool 时,git 将本地存储库中的修改文件与远程存储库中的匹配文件进行比较。为此,它会为远程创建一个临时文件,设置变量 LOCALREMOTE 并调用 git 配置中为差异指定的任何工具。

默认情况下,临时文件在/tmp/<hash>_filename 中创建。 是否可以更改此默认位置?

你为什么要这样做?

长话短说,我正在通过 Windows 子系统为 linux 使用 git,我想使用 Windows 工具进行差异和合并。问题是,/tmp 无法从 Windows 端访问,因此我需要将 git 创建临时文件的默认位置移动到 Windows 可访问的位置。

我尝试了什么:

到目前为止,我只能找到对sudo mount -B /tmp /mnt/c/tmp 的建议,但这似乎不起作用(/tmp 仍然指向与以前相同的目录...)

【问题讨论】:

  • 你试过设置TMPDIR环境变量吗?
  • No.. 在 tbh 之前从未听说过。我查一下
  • 嗯,做到了(有些矫枉过正)。我希望这可以通过git 配置而不是系统范围的变量来实现。现在我在控制台中运行的所有命令都将使用我的新 tmp 位置。 @sergej,如果您将其添加为答案,我至少会支持它(如果不存在其他仅 git 选项,则将其标记为实际答案)。我还要对 TMPDIR 对像我这样的 linux 无知的人做一个最小的解释;)
  • 这是 git。 Git 创建临时文件,然后将LOCALREMOTE 设置为临时文件和存储库中匹配文件的路径。它最终调用.gitconfig中指定的命令并设置环境变量
  • @Liam 是的,这正是我正在做的。然而,自定义命令将LOCALREMOTE 作为两个文件的参数来区分。我的问题是在 where LOCAL 创建,而不是在调用外部工具

标签: git git-difftool


【解决方案1】:

您可以尝试设置TMPDIR 环境变量。

来自POSIX 手册:

TMPDIR 该变量应代表一个目录的路径名,该路径名可供需要创建临时文件的位置的程序使用。


看了下git代码(git/builtin/difftool.c),觉得目前不支持配置temp目录:

/* Setup temp directories */
tmp = getenv("TMPDIR");
xsnprintf(tmpdir, sizeof(tmpdir), "%s/git-difftool.XXXXXX", tmp ? tmp : "/tmp");

如果未定义 TMPDIR,似乎 git 正在使用 TMPDIR 值或 "/tmp"

【讨论】:

  • 在此处添加我在问题下也发表的评论:这有效,但是它正在改变/tmp,因为 all 命令在您的控制台中运行。 IMO 这太过分了,所以我希望有一种方法可以在 git 的配置中设置它。
  • 我一直在挖掘源代码,试图找到这一行。干得好。如果您真的非常想要此功能,您可以向邮件列表发布功能请求。
  • 哇,我想这就解决了。
  • 如果您的 difftool 是 tkdiff,请确保您的 ~/.tkdiffrc 文件没有定义 tmpdir,因为它可能会覆盖您的 shell 环境的 TMPDIR。
【解决方案2】:

同样的问题,解决方法不是通过更改 git 的临时目录,而是使用您可以定义的 diff 脚本:

  1. .gitconfig中的差异定义脚本

    [diff]
    external = /home/user/scripts/my_diff.sh
    
  2. 创建脚本/home/user/scripts/my_diff.sh 以使用 Windows 工具:

    #!/bin/bash
    FILE2="C:\\dev\\wsl\\Debian\\rootfs\\${2//\//\\}"
    FILE1=$(wslpath -w $5)
    /c/Program\ Files\ \(x86\)/WinMerge/WinMergeU.exe $FILE1 $FILE2
    

在我的示例中,我使用的是 WinMerge。
我知道这个解决方案违反了不允许 Windows 工具接触 Linux 文件的规则,但我对此很好,因为我们谈论的是临时文件,无论如何我都看不到在 WinMerge 中更改它的意义。 手动路径替换是必要的,因为 wslpath 不适用于 Linux 内部路径。

您的 WSL 可能不同,通常在某个地方

C:\Users\%username%\AppData\Local\Packages\TheDebianProject.DebianGNULinux_76v4gfsz19hv4\LocalState\rootfs

这感觉有点hacky,但我一直在使用它并且到目前为止我很开心。

【讨论】:

    【解决方案3】:

    我在这里对这两种方法做了一个变体,供我自己使用。我创建了一个我调用的脚本,而不是运行git diff(更改“twm”路径,如果复制 - 那是我自己的用户目录):

    #!/bin/bash                                                                     
    
    export TMPDIR=$( realpath --relative-to=. /mnt/c/Users/twm/tmp )
    git difftool -y -t winmerge "$@"
    

    我专门针对在 Linux 的 Windows 子系统中运行的 Git 调用的 WinMerge。我在使用 TMPDIR 时遇到的问题是,当 Git 写入时,WinMerge 无法识别临时路径,最初是因为它以“/mnt/c”开头 - 我确实获得了 WSL 和 Windows 之间匹配的路径,除了领先的“c:”,WinMerge 仍然无法识别它。但是,我注意到另一个路径被正确识别,ps 显示它作为相对路径传递给 WinMerge,所以我使用realpath 也使 TMPDIR 相对。

    使用脚本在本地设置 TMPDIR 也解决了 cmets 中提到的问题。也就是说,为这个用例更改所有其他程序的临时目录似乎有点矫枉过正,并且可能会产生一些意想不到的副作用。

    就像这里列出的第二种方法一样,我也对 Git 别名进行了修改,试图让它发挥作用。但是,我想利用 Git 现有的 WinMerge 集成,以防现在或将来内置集成提供比硬编码脚本更多的功能。

    【讨论】:

      【解决方案4】:

      把它放在 windows/HOME 目录下的 .gitconfig 中。 您需要为 cygpath(和 git)命令安装 cygwin 并在下方调整 WinMerge 的位置

      [difftool "winmerge"]
               # Usage: git difftool --tool winmerge
              path = C:/bin/WinMergeU.exe
              cmd =  C:/bin/WinMergeU.exe \"$(cygpath -wam $LOCAL)\" \"$(cygpath -wam $REMOTE)\"
      

      【讨论】:

        猜你喜欢
        • 2012-10-26
        • 1970-01-01
        • 1970-01-01
        • 2023-04-01
        • 1970-01-01
        • 1970-01-01
        • 2016-06-21
        • 2013-02-23
        • 2022-08-20
        相关资源
        最近更新 更多