使用git我可以设置一个自定义差异工具,用于.git/config
[diff "csv_diff"]
command = Tools/csv_diff
,这在.gitattributes
(在存储库的根目录中)
*.csv diff=csv_diff
这在使用git diff
时有效,但不适用于git show
。我的问题是,如何使用git show
的自定义工具?
答案 0 :(得分:27)
看起来您正在寻找--ext-diff
选项。
以下是git show
docs对此的评价:
<强> - EXT-DIFF 强>
允许执行外部diff助手。如果您使用
gitattributes
设置外部差异驱动程序,则需要将此选项与git-log
和朋友一起使用。
答案 1 :(得分:9)
与@LucasTrzesniewski一样,您可以从命令行使用--ext-diff
为当前会话设置差异。
您也可以使用.gitattributes设置git-diff perfile。
git diff实现包含两部分:
$GIT_DIR/config
或$HOME/.gitconfig
gitattributes
Git已选择将此可执行代码与源代码分开,这使得git clone
或其他git命令无法运行任何有害代码。
要编写定义,我们从包含[diff "namehere"]
的标题开始,然后是换行符。
下一行包含命令定义,该行如下:command = commandlinehere
。然后,如果运行了7个参数,则会调用此命令,这些参数记录在文档中的GIT_EXTERNAL_DIFF环境中。
<强>
GIT_EXTERNAL_DIFF
强> 当环境变量GIT_EXTERNAL_DIFF是 set,调用它命名的程序,而不是diff调用 如上所述。对于添加,删除或修改的路径, 使用7个参数调用GIT_EXTERNAL_DIFF
:path old-file old-hex old-mode new-file new-hex new-mode where:
&lt; old | new&gt; -file 是GIT_EXTERNAL_DIFF可用于读取的文件 &lt; old | new&gt;,
的内容&lt; old | new&gt; -hex 是40-hexdigit SHA-1哈希,
&lt; old | new&gt; -mode 是文件模式的八进制表示。
文件参数可以指向用户的工作文件(例如 “git-diff-files”中的新文件,/ dev / null(例如新文件时的旧文件) 添加了文件)或临时文件(例如索引中的旧文件)。
GIT_EXTERNAL_DIFF
不应该担心取消关联临时文件,在GIT_EXTERNAL_DIFF
退出时会将其删除。对于未合并的路径,使用1调用
GIT_EXTERNAL_DIFF
参数,&lt; path&gt;。对于每个路径调用
GIT_EXTERNAL_DIFF
,两个环境变量,GIT_DIFF_PATH_COUNTER
和GIT_DIFF_PATH_TOTAL
已设置。
总示例如下所示:
[diff "jcdiff"]
command = j-c-diff
我们需要修改我们的gitattributes以使用我们的自定义驱动程序。 gitattributes文件包含类似于filename value [value2 [value3 [value4 [...]]]]
的语法。
<强>示例:强>
* diff=jcdiff
我们为每个文件使用自定义git diff。
*.java diff=javadiff
*.python diff=pythondiff
对java文件使用javadiff,对python文件使用pythondiff。
* diff=globaldiff
*.java diff=javadiff
对java文件使用javadiff,对剩余文件使用globaldiff。
--ext-diff
您可以使用git config alias.showobject 'show --ext-diff'
添加别名来定义名为git showobject
的新命令,该命令会自动使用我们的过滤器。
答案 2 :(得分:3)
作为其他人寻求使用meld和ssn.charAt(8)
等差异工具的替代答案
git show
大多数时候,我喜欢在命令行上看到我的小差异,因为它很快,但每隔一段时间我就想启动一个差异工具来检查更深层次的东西 - 尤其是别人的工作。但这排除了使用git difftool --tool=meld HEAD~..HEAD
的能力,因为这将是默认行为。
为了显示特定的提交或分支,我已在.gitattributes
~/.gitconfig
这将启动meld以显示该提交引入的差异:
[alias]
showm = "!f(){ if [ -z $1 ]; then c='HEAD'; else c=$1; fi; git difftool --tool=meld -y $c~..$c; }; f"
如果没有参数,它将使用git showm <branch or hash>
作为默认值:
HEAD
作为奖励,您可以使用bash别名进行操作,以通过将其添加到git showm
~/.bashrc
答案 3 :(得分:1)
这很简单,您在git配置中必须输入了错误的命令键。
应该是这样的:
[diff "csv_diff"]
textconv = Tools/csv_diff
这在git show
和显示差异的所有其他位置(甚至在gitk
中也有效)。
我用git version 2.24.1.windows.2
和以下配置文件尝试过:
gitconfig
[diff "zip"]
textconv = unzip -c -a
[diff "tgz"]
binary = true
textconv = tar -xvzO -f
[diff "gz"]
binary = true
textconv = gunzip -c
gittributes
*.zip diff=zip
*.tgz diff=tgz
*.tar.gz diff=tgz
*.sql.gz diff=gz
如果您的命令不希望将文件名作为最后一个参数,则可以执行以下操作:
[diff "sqlite3"]
binary = true
textconv = "f() { sqlite3 $1 --readonly .dump; }; f"
$1
代表插入文件名的位置。
也许您必须将$1
括在单引号中以支持带空格的文件名。