使用自定义差异工具和`git show`

时间:2016-01-19 19:30:09

标签: git

使用git我可以设置一个自定义差异工具,用于.git/config

中的以下某些文件扩展名
[diff "csv_diff"]
    command = Tools/csv_diff

,这在.gitattributes(在存储库的根目录中)

*.csv diff=csv_diff

这在使用git diff时有效,但不适用于git show。我的问题是,如何使用git show的自定义工具?

4 个答案:

答案 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_COUNTERGIT_DIFF_PATH_TOTAL已设置。

总示例如下所示:

[diff "jcdiff"]
command = j-c-diff

编写gitattributes

我们需要修改我们的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。

配置git以自动设置--ext-diff

您可以使用git config alias.showobject 'show --ext-diff'添加别名来定义名为git showobject的新命令,该命令会自动使用我们的过滤器。

答案 2 :(得分:3)

作为其他人寻求使用meldssn.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括在单引号中以支持带空格的文件名。