在存储库中调用git difftool
时,git会将本地存储库中的已修改文件与其在远程中的匹配进行比较。为此,它为远程创建一个临时文件,设置变量LOCAL
和REMOTE
,并调用git配置中为diffs指定的任何工具。
默认情况下,临时文件是在/tmp/<hash>_filename
中创建的。 是否可以更改此默认位置?
长话短说,我通过windows子系统使用git for linux,我想使用windows工具做差异和合并。问题是,/tmp
无法从Windows端访问,因此我需要将git创建临时文件的默认位置移动到Windows可访问的位置。
到目前为止,我所能找到的只是对sudo mount -B /tmp /mnt/c/tmp
的建议,但这似乎不起作用(/tmp
仍指向与之前相同的目录...)
答案 0 :(得分:6)
您可以尝试设置TMPDIR
环境变量。
来自POSIX手册:
TMPDIR
此变量应表示可用于需要创建临时文件的位置的程序的目录的路径名。
快速查看git代码(git/builtin/difftool.c
)后,我不认为目前支持配置临时目录:
/* Setup temp directories */
tmp = getenv("TMPDIR");
xsnprintf(tmpdir, sizeof(tmpdir), "%s/git-difftool.XXXXXX", tmp ? tmp : "/tmp");
似乎git正在使用TMPDIR
值,或"/tmp"
,如果未定义TMPDIR
。
答案 1 :(得分:2)
相同的问题,不是通过更改git的临时目录而是使用diff脚本可以定义的解决方案:
在.gitconfig
中为diff定义脚本
[diff]
external = /home/user/scripts/my_diff.sh
创建脚本/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
这感觉有些棘手,但我一直在使用它,直到现在我都很高兴。
答案 2 :(得分:0)
我在这里做了两种方法的变体,供我自己使用。我创建了一个脚本,而不是运行git diff
来调用该脚本(如果要复制,请更改“ twm”路径-这是我自己的用户目录):
#!/bin/bash
export TMPDIR=$( realpath --relative-to=. /mnt/c/Users/twm/tmp )
git difftool -y -t winmerge "$@"
我专门针对WinMerge,该WinMerge是由在Linux的Windows子系统中运行的Git调用的。我使用TMPDIR遇到的问题是,当Git写入它时,WinMerge无法识别临时路径,最初是因为它以“ / mnt / c”开头-我确实获得了WSL和Windows之间匹配的路径,除了前导“ c:”和WinMerge仍然不认识它。但是,我注意到另一条路径已正确识别,ps
显示它已作为相对路径传递给WinMerge,因此我也使用realpath
来使TMPDIR相对。
使用脚本在本地设置TMPDIR还可解决注释中提到的问题。也就是说,在一个用例中,为所有其他程序更改临时目录似乎有些过头,而且可能会产生一些意想不到的副作用。
就像这里列出的第二种方法一样,我也尝试过修改Git别名,以使它起作用。但是,我想利用Git现有的WinMerge集成,以防现在或将来内置的集成提供比硬编码脚本更多的功能。
答案 3 :(得分: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)\"