使用自定义diff工具和`git show`

Kha*_*lid 26 git

使用git,我可以通过以下方式设置用于某些文件扩展名的自定义diff工具 .git/config

[diff "csv_diff"]
    command = Tools/csv_diff
Run Code Online (Sandbox Code Playgroud)

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

*.csv diff=csv_diff
Run Code Online (Sandbox Code Playgroud)

这在使用时有效git diff,但不起作用git show.我的问题是,我如何使用自定义工具git show

Luc*_*ski 29

看起来你正在寻找--ext-diff选项.

以下是git show文档对此的评价:

--ext-DIFF

允许执行外部diff助手.如果您设置了外部差异驱动程序gitattributes,则需要将此选项与git-log朋友一起使用.


Fer*_*big 10

就像@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时,将调用由其命名的程序,而不是上面描述的diff调用.对于添加,删除或修改的路径, GIT_EXTERNAL_DIFF使用7个参数调用:

path old-file old-hex old-mode new-file new-hex new-mode where:
Run Code Online (Sandbox Code Playgroud)

<old | new> -file是GIT_EXTERNAL_DIFF可用于读取<old | new>内容的文件,

<old | new> -hex是40-hexdigit SHA-1哈希,

<old | new> -mode是文件模式的八进制表示.

文件参数可以指向用户的工作文件(例如"git-diff-files"中的new-file),/ dev/null(例如添加新文件时的旧文件)或临时文件(例如old-文件在索引中). GIT_EXTERNAL_DIFF不要担心取消链接临时文件,它会在GIT_EXTERNAL_DIFF退出时被删除.

对于未合并的路径,GIT_EXTERNAL_DIFF使用1参数<path>调用.

对于每个路径GIT_EXTERNAL_DIFF被称为两个环境变量, GIT_DIFF_PATH_COUNTERGIT_DIFF_PATH_TOTAL设置.

总示例如下所示:

[diff "jcdiff"]
command = j-c-diff
Run Code Online (Sandbox Code Playgroud)

编写gitattributes

我们需要修改我们的gitattributes以使用我们的自定义驱动程序.gitattributes文件包含类似于的语法filename value [value2 [value3 [value4 [...]]]].

例子:

*           diff=jcdiff
Run Code Online (Sandbox Code Playgroud)

我们为每个文件使用我们的自定义git diff.

*.java      diff=javadiff
*.python    diff=pythondiff
Run Code Online (Sandbox Code Playgroud)

使用javadiff用于java文件,pythondiff用于python文件.

*           diff=globaldiff
*.java      diff=javadiff
Run Code Online (Sandbox Code Playgroud)

使用javadiff表示java文件,使用globaldiff表示剩余文件.

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

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


Jef*_*ett 6

作为搜索使用像一个diff工具的为他人的替代答案MELDgit show

git difftool --tool=meld HEAD~..HEAD
Run Code Online (Sandbox Code Playgroud)

大多数时候我喜欢在命令行上看到我的小差异,因为它很快,但每隔一段时间我确实想启动一个差异工具来更深入地检查事情 - 尤其是其他人的工作。但这排除了使用的能力,.gitattributes因为这将成为默认行为。

为了显示特定的提交或分支,我在我的 ~/.gitconfig

[alias]
    showm = "!f(){ if [ -z $1 ]; then c='HEAD'; else c=$1; fi; git difftool --tool=meld -y $c~..$c; }; f"
Run Code Online (Sandbox Code Playgroud)

这将启动 meld 以显示该提交引入的差异:

git showm <branch or hash>
Run Code Online (Sandbox Code Playgroud)

如果没有参数,它将HEAD用作默认值:

git showm
Run Code Online (Sandbox Code Playgroud)

作为奖励,您可以使用 bash 别名跟进,通过将其添加到分支名称来获取分支名称的制表符完成 ~/.bashrc

alias showm='git showm'
__git_complete showm _git_show
Run Code Online (Sandbox Code Playgroud)

  • 对于合并提交,“git diff HEAD~..HEAD”不等同于“git show”。我专门使用后者来检查前向集成(验证合并冲突是否已正确解决)。`git diff` 不是一个替代方案。差远了。 (2认同)