9

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

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

为什么要这么做?

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

我尝试了什么:

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

4

4 回答 4

8

您可以尝试设置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");

似乎 git 正在TMPDIR取值,或者"/tmp",如果TMPDIR未定义。

于 2018-05-09T08:45:58.800 回答
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,但我正在使用它并且到目前为止我很开心。

于 2019-01-12T21:19:15.347 回答
0

我在这里对这两种方法做了一个变体,供我自己使用。我创建了一个我调用而不是运行的脚本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 也解决了评论中提到的问题。也就是说,为这个用例更改所有其他程序的临时目录似乎有点矫枉过正,并且可能会产生一些意想不到的副作用。

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

于 2019-01-20T20:08:18.847 回答
0

将它放在 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)\"
于 2020-07-15T13:49:50.300 回答