我一直在关注" blog entry by Dave"我在Windows 7上链接到此answer并使用SourceGear的DiffMerge工具。我已将git\cmd
目录添加到我的PATH系统变量中,并将git-diff-diffmerge-wrapper.sh
文件放在那里:
#!/bin/sh
"C:\Program Files\SourceGear\Common\DiffMerge\sgdm.exe" "$1" "$2" | cat
(是的,它是DiffMerge的正确路径。)
我已编辑了我的.gitconfig
文件以包含diff
和difftool
块(我直接从帖子中复制了这些行,并且他确实留下了已注释掉的内容#external
行。我将其添加到文件的末尾;是吗?)
[diff]
# external = git-diff-wrapper.sh
tool = diffmerge
[difftool "diffmerge"]
cmd = git-diff-diffmerge-wrapper.sh "$LOCAL" "$REMOTE"
所以我转到git bash
并执行git difftool HEAD~ 67b8679 -- js/site/pizzabuilder.js
并按Enter键。什么都没发生。如果我做git difftool HEAD~ 67b8679
,请不要使用我想要的文件,我会得到这个:
Viewing: 'js/angular/hutlovers/hutlovers.js'
Launch 'diffmerge' [Y/n]: Y
C:\Program Files (x86)\Git/libexec/git-core/mergetools/defaults: line 17: git-diff-diffmerge-wrapper.sh: command not found
Viewing: 'js/angular/localization/StoreListCtrl.js'
Launch 'diffmerge' [Y/n]: n
Viewing: 'js/pizzahut/site/browser_version.js'
Launch 'diffmerge' [Y/n]: n
Viewing: 'js/pizzahut/site/dashboard.js'
Launch 'diffmerge' [Y/n]: n
对于提交之间不同的所有文件,它会继续,但它永远不会启动DiffMerge。我不知道如何解释错误;什么命令没找到? difftool
?我在git中运行1.7.11,并且difftool
应该包含在从1.6.3版本开始的git中。
当我查看错误中引用的文件的第17行时,这就是:
( eval $merge_tool_cmd )
作为此块的一部分:
diff_cmd () {
merge_tool_cmd="$(get_merge_tool_cmd "$1")"
if test -z "$merge_tool_cmd"
then
status=1
break
fi
( eval $merge_tool_cmd )
status=$?
return $status
}
任何人都可以帮助我吗?我是git
的日常用户,但几乎不是高级用户,而且我对Windows shell脚本一无所知,所以遵循该帖子中的指示几乎是我目前知识的极限。
答案 0 :(得分:7)
不确定这是否有帮助,但这是我使用DiffMerge配置的difftool
。 请注意,我使用msysgit Bash (不确定Cygwin或PoshGit用户是否会有所不同):
[diff]
tool = dm
[difftool "dm"]
cmd = C:/Program\\ Files/SourceGear/Common/DiffMerge/sgdm.exe \"$LOCAL\" \"$REMOTE\"
我目前正在使用Git 2.0,但我似乎记得用Git 1.8.x或者甚至早在Git 1.7.x中设置了它,所以试试看它是否有效。< / p>
我现在用Beyond Compare 3 Pro实际上在Windows上做了大部分差异,尽管有时我仍会使用DiffMerge。如果您要进行切换,以下是我的所有difftool
设置:
[merge]
tool = bc3
[diff]
tool = bc3
[difftool "dm"]
cmd = C:/Program\\ Files/SourceGear/Common/DiffMerge/sgdm.exe \"$LOCAL\" \"$REMOTE\"
[difftool "bc3"]
cmd = "\"c:/program files (x86)/beyond compare 3/bcomp.exe\" \"$LOCAL\" \"$REMOTE\""
[mergetool "bc3"]
cmd = "\"c:/program files (x86)/beyond compare 3/bcomp.exe\" \"$LOCAL\" \"$REMOTE\" \"$BASE\" \"$MERGED\""
答案 1 :(得分:3)
我知道这是一个老问题,我知道我的情况可能只是我愚蠢,但我确实旋转我的车轮试图解决这个问题。但是,希望有一个与我犯同样错误的人将来也不会完全迷失。
确保项目显示为TypeError: '(slice(None, None, None), 1)' is an invalid key
!
我有一个非常简单的换线。做了git diff
然后被打断了。回来完成并决定仔细检查差异。我没有意识到做git add .
会阻止我使用git add
。
允许git difftool
允许git reset
工作。
答案 2 :(得分:2)
其他答案都不适合我。我终于使用Git 2.6.3,2.7.0
在Windows 7,8,10上工作了1)确保您可以写入并使用存储在〜/ .gitconfig中的全局.gitconfig,它相对于您的HOME路径。
使用:
git config --global --edit
或者只是导航到Windows资源管理器中的文件并以这种方式进行编辑。
可以通过导航到窗口中的环境变量来设置HOME变量(对于7,右键单击计算机 - &gt;属性 - &gt;高级系统设置 - &gt;环境变量)。
2)确保diffmerge在您机器上的PATH变量中。这与HOME变量位于同一位置。 我把它添加到我的路径中:
C:\Program Files\SourceGear\Common\DiffMerge;
3)要使diffmerge成为默认值,请将以下内容添加到全局.gitconfig文件中:
[merge]
tool = diffmerge
[mergetool]
prompt = true
[mergetool "diffmerge"]
path = C:\\Program Files\\SourceGear\\Common\\DiffMerge\\sgdm.exe
'\'是转义字符
重复使用difftool的东西,这就是我需要让它工作的全部内容。不需要包装器脚本或本地远程变量。
答案 3 :(得分:2)
SourceTree用户遇到此问题中描述的问题的一种可能性:如果您在SourceTree中右键单击并启动外部合并工具(内部运行git mergetool sourcetree
行)时遇到此问题,{ {3}}导致它在解决文件一侧被删除的冲突时挂起。
由于SourceTree的UI没有明确地指示冲突的原因是文件在一侧或另一侧被删除,因此这进一步复杂化。
您可以通过打开终端并运行以下来确认:
git mergetool
您会看到如下内容:
Deleted merge conflict for 'Stuff/Other/Thingamajig.js':
{local}: modified file
{remote}: deleted
Use (m)odified or (d)eleted file, or (a)bort?
这踢了我的屁股超过一个小时,在此期间我最终得到了这个问题,所以我在这个答案中留下了我的发现,以帮助下一个可能成为这个虫子受害者的可怜的灵魂。 / p>
(如果您做遇到此问题,请考虑点击上面的链接并对SourceTree错误进行投票,以便Atlassian了解此问题的影响程度。)< / p>
答案 4 :(得分:1)
在我看来,问题是git bash使用的路径不是Windows正在使用的路径。我通过在 git bash 中运行env | grep PATH
来检查它。
我知道你不想搞砸git安装,所以我建议你给你的包装器提供完整的路径。
你必须使用cygwin格式给它。怎么做?
1)转到你有包装器的地方,然后在那里运行 Git Bash 。
2)在 Git Bash 窗口中键入pwd
,它将显示当前的工作目录。右键单击窗口标题,然后选择标记。使用鼠标选择路径(在我的情况下是/C/Users/lpiepiora/cmds
并点击 Enter 。
3)现在编辑你的.gitconfig
并将复制的路径添加到它(你必须在复制路径的末尾添加一个额外的斜杠)。
完成这些步骤后,您应该能够启动合并工具。
PS。您可能希望将git-diff-diffmerge-wrapper.sh
更改为这些内容,以便处理正确删除/添加的文件,因为它是answer中建议的另一个question。
#!/bin/sh
NULL="/dev/null"
if [ "$2" = "$NULL" ] ; then
echo "removed: $1"
elif [ "$1" = "$NULL" ] ; then
echo "added: $2"
else
echo "changed: $3"
"C:\Program Files\SourceGear\Common\DiffMerge\sgdm.exe" "$1" "$2" | cat
fi
答案 5 :(得分:-1)
[diff]
tool = meld
[difftool]
prompt = false
[difftool "meld"]
cmd = "\"C:\\Program Files (x86)\\Meld\\Meld.exe\" \"$LOCAL\" \"$REMOTE\""
添加到以上答案。这是我的Windows的git配置,用于将diff作为差异工具
小心"