2014-01-13 61 views
6

看來,當git difftool執行外部命令時,它不會正確引用參數。`git difftool`和witespaces在名稱文件中

如果.gitconfig包含以下行:

[difftool.echo] 
    cmd = echo "$LOCAL" "$REMOTE" 

當我嘗試用包含空格的路徑運行difftool,如

> git difftool -t echo HEAD^ HEAD spaces\ here/test.txt 

我得到以下結果:

/tmp/RL2Nyi_test.txt spaces here/test.txt 

正如你所看到的,文件名不被引用(儘管ex在命令中使用plicit引號),因此參數解析失敗。刪除.gitconfig(編輯:以及將它們轉義爲\")中的引號不會改變結果。

(用任何diff程序代替echo,你會得到更有意義的用例)。

如何獲得正確轉義的文件名?

+0

我認爲你必須逃脫引號:'CMD =回聲\ 「$ LOCAL \」 \ 「$ REMOTE \」' – CharlesB

+0

我也嘗試過,仍然沒有改變。 –

+0

'cmd =「echo」$ LOCAL \「\」$ REMOTE \「」'',cmd =「echo'$ LOCAL''$ REMOTE'」''? – CharlesB

回答

5

你會想在.gitconfig逃避周圍的命令報價:

cmd = difftoolname \"$LOCAL\" \"$REMOTE\" 
+0

再次感謝!正如評論中指出的那樣,這適用於我的用例,儘管帶'echo'的版本仍然不會在文件名周圍打印引號。 –

1

這應該工作:

[difftool.echo] 
    cmd = 'echo "$LOCAL" "$REMOTE"' 

用單引號環繞整個命令導致的Git把它作爲一個單一的字符串,它被分配到diftool.echo命令修改。這是我們想要的。

這是非常相似的一個suggested in the comments above,沒有工作:

# This won't work 
cmd = "echo '$LOCAL' '$REMOTE'" 

,這不工作的原因有引號中的Bash(最炮彈一般的處理方式做)。這個命令分配echo '$LOCAL' '$REMOTE'作爲命令,但單引號將不是展開變量。這就是爲什麼你得到了$LOCAL $REMOTE的文字輸出。

在這篇文章頂部的工作版本中的內部雙引號將允許它們內部的參數被擴展。

+0

仍然無法使用。 '/ usr/lib/git-core/git-difftool - helper:1:eval:echo $ LOCAL $ REMOTE:not found'失敗。我想通過這種方式,它尋找一個名爲'echo $ LOCAL $ REMOTE'的可執行文件 –