使用' git difftool'当其中一个文件是最新版本时,它会将相对路径传递给外部差异应用程序。
〜/的.gitconfig
[difftool "echo"]
cmd = echo $LOCAL $REMOTE
path =
[diff]
tool = echo
示例命令
git difftool e3d654bc65404b9229abc0251a6793ffbfccdee3 6c6b5fd34196402e4fa0e8cf42f681d9fbd5359f
Viewing: 'app/views/shared/_graph.html.slim'
Launch 'echo' [Y/n]: y
app/views/shared/_graph.html.slim /var/folders/fs/3pgvhwkj2vq4qt3q6n74s5880000gn/T//XGFoyj__graph.html.slim
在这个示例中,app/views/shared/_graph.html.slim
是传递给外部diff应用程序的相对路径,因为它是相对的,diff应用程序不知道如何打开它。
如何制作' git difftool'总是输出绝对路径?
答案 0 :(得分:3)
将echo命令放在包装器脚本
中$ tail -5 ~/.gitconfig
[difftool "echo"]
cmd = /tmp/test/echo.sh $LOCAL $REMOTE
path =
[diff]
tool = echo
$ cat /tmp/test/echo.sh
#!/bin/sh
LOCAL="$1"
REMOTE="$2"
case "$LOCAL"
in
/*)
L="$LOCAL"
;;
*)
L=`git rev-parse --show-toplevel`/"$LOCAL"
;;
esac
case "$REMOTE"
in
/*)
R="$REMOTE"
;;
*)
R=`git rev-parse --show-toplevel`/"$REMOTE"
;;
esac
echo "$L" "$R"
$
然后它将输出文件的绝对路径:
$ git status
# On branch master
# Changes not staged for commit:
# (use "git add <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
#
# modified: dummy
#
no changes added to commit (use "git add" and/or "git commit -a")
$ git difftool
Viewing: 'a/b/c/dummy'
Hit return to launch 'echo':
/tmp/vsDkDe_dummy /tmp/test/a/b/c/dummy
$
答案 1 :(得分:2)
您可以使用git rev-parse --show-toplevel
在$ LOCAL变量之前添加以获取完整路径。
有趣的是,有一个补丁正在进行中(2014年2月),它将添加该命令以使difftool在子模块中工作:
&#34; [PATCH]
difftool
: support repositories with .git-files
&#34;
git-difftool.perl#find_worktree
成为
sub find_worktree
{
# Git->repository->wc_path() does not honor changes to the working
# tree location made by $ENV{GIT_WORK_TREE} or the 'core.worktree'
# config variable.
return Git::command_oneline('rev-parse', '--show-toplevel');
}
答案 2 :(得分:2)
这是基于我最终使用的hlovdal和VonC答案的解决方案。
〜/ .git_absolute_path.sh
#!/bin/sh
FILE_PATH="$1"
case "$FILE_PATH"
in
/*)
NEW_PATH="$FILE_PATH"
;;
*)
NEW_PATH=`git rev-parse --show-toplevel`/"$FILE_PATH"
;;
esac
echo "$NEW_PATH"
〜/的.gitconfig
[difftool "echo"]
cmd = echo `~/.git_absolute_path.sh $LOCAL` `~/.git_absolute_path.sh $REMOTE`
path =
[mergetool "echo"]
cmd = echo `~/.git_absolute_path.sh $LOCAL` `~/.git_absolute_path.sh $REMOTE` `~/.git_absolute_path.sh $BASE` `~/.git_absolute_path.sh $MERGED`
trustExitCode = true
[diff]
tool = echo
这里的不同之处在于我们正在为每条路径重用单个脚本。
答案 3 :(得分:1)
尽管没有记录,但git即使将$PWD
解释为Print Working Directory Linux命令,即使从Windows命令提示符处调用它也是git存储库的工作目录。
因此,您可以将$PWD
与$BASE
,$LOCAL
,$REMOTE
和$MERGED
一起使用。