2

在执行. 时git diff,有时我想使用不同的 diff 工具(例如,cmp或我自己的 bin 目录中的自制 word-diff 程序)。

许多类似 diff 的程序都有一个选项

-D <diffprog>

告诉他们改用其他差异或类似差异的程序。

我知道 git-difftool 和这个问题,但这并不是我想要的。我宁愿不必提前配置一些东西,我今天要使用的非标准命令可能不是我明天要使用的非标准命令。理想情况下,我希望能够从命令行一次性完成。

(是否可以将 difftool 配置为能够使用多个不在官方列表中的非标准工具?)

如果git diff使用我选择的 diff 工具太麻烦,我也可以使用类似的东西

git cat file | mydiff - file

我知道没有像“git cat”这样的命令。但是这里的想法是手动将文件的 repo 版本与本地文件进行比较,给定一个 git 命令来简单地发出文件的 repo(或在其他情况下,索引)版本。有没有这样的命令?

最后,如果没有git diff -D diffprog我要询问的假设选项,并且如果没有我假设的“git cat”命令之类的东西,那么我希望它们是错误的吗?

4

4 回答 4

4

我想你可能正在寻找类似的东西

git show somecommit:path/to/file | mydiff - path/to/file

或者

mydiff  <(git show somecommit:path/to/file) \
        <(git show someothercommit:path/to/file)

但是一点手册页阅读说 difftool 确实接受路径限制器,并且也有-x选项,所以我没有看到任何问题。对于您评论中的情况,我会使用

git difftool -yx mydiff @ -- file
于 2021-06-17T02:37:18.393 回答
3

git在外部查看器中打开差异的集成方式是git difftool.

就 cli 选项而言,git difftool采用与 相同的参数git diff,并在外部查看器中打开生成的差异。
一个额外有用的选项是-d | --dir-diff,它将在临时目录中创建您的回购的两个签出并以“目录比较模式”打开外部查看器:

git difftool -d <something> <something else>

至于外部工具的选择:

  • 您可以配置默认的 difftool :git config diff.tool kdiff3
  • 您可以使用以下方式选择您想要的任何工具-t | --tool
git difftool -t meld <something> <something else>
  • difftool.<tool>.cmd您还可以通过在 git 配置中创建条目来定义自定义命令

引用该-t|--tool部分的文档:

您可以通过设置配置变量显式提供工具的完整路径difftool.<tool>.path。例如,您可以通过设置来配置 kdiff3 的绝对路径difftool.kdiff3.path。否则, git difftool 假定该工具在PATH.

git difftool 可以通过在配置变量中指定要调用的命令行来自定义运行替代程序,而不是运行已知的差异工具之一difftool.<tool>.cmd

当使用此工具调用 git difftool(通过-tor--tool选项或diff.tool配置变量)时,将使用以下可用变量调用配置的命令行:$LOCAL设置为包含 diff 前映像内容的临时文件的名称并$REMOTE设置为包含差异后图像内容的临时文件的名称。$MERGED是正在比较的文件的名称。$BASE提供与自定义合并工具命令的兼容性,并且具有与 相同的值$MERGED

于 2021-06-16T21:53:40.977 回答
2

除了jthill 的回答中提到的原始git showgit cat-file -p技巧之外,您还可以按照LeGEC 的回答中的描述使用。为避免配置错误或需要特殊的一次性配置文件,请考虑在前端命令中添加选项:git difftool-cgit

git -c diff.tool=whatever ...

这种模式通常有效:如果您想假装配置文件加起来有一些特定的x设置为y,那么就可以了。多个选项聚集在一起并按配置使用。git config -c x=y-c

(我相信这会增加配置并依赖于“最后一个配置覆盖早期配置”的东西,所以对于像这样的多值设置,如果你需要避免拾取用户配置,你目前必须使用像修改这样的技巧,它有 .. . 缺点。即将发布的 Git 版本可以跳过系统和用户配置,用于特殊目的,包括 Git 自己的自测。)remote.remote.fetch$HOME

于 2021-06-17T15:19:30.310 回答
0

警告 Emptor:此解决方案特定于使用git-1.8.3.1(可从base/ updatesyum repositories on RHEL7/ Centos 7/获得的 git 版本OtherClone 7,其中 git 不支持--ignore-white-space(在 中引入git-1.8.4)。

对我来说,以下工作可以创建输出,就好像git支持--ignore-blank-lines使用 GNU一样diff

git diff --name-only |xargs -rn1 bash -c 'git diff $0 |head -n4; git show HEAD:$0 | diff -U3 -b - $0|tail -n+3'

解释:

  • git diff --name-only给我更改行的列表
  • | xargs -rn1 ...获取文件列表并...为每个输入运行,将输入作为最后一个参数传递给...
  • bash -c 'git diff $0 |head -n4; git show HEAD:$0 | diff -U3 -b - $0|tail -n+3'接受参数 '$0' (包含路径)并在其第一个参数上运行 2 个子命令$0
    • git diff $0在路径 ( ) 上运行$0,以获取标头,丢弃实际的差异
    • git show HEAD:$0通过管道获取文件的签入版本| diff -U3 -b -B - $0以生成差异,然后通过管道| tail -n+3丢弃由 GNU 生成的标头diff

git diffheader 与 GNU 生成的主体的组合diff为我提供了我想要的输出。

希望通过解释,该解决方案可以在许多用例中根据需要进行拆卸和使用

于 2022-01-14T09:38:15.023 回答