微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

git diff,使用外部 diff 程序,只需一次

如何解决git diff,使用外部 diff 程序,只需一次

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

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

-D <diffprog>

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

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

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

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

git cat file | mydiff - file

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

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

解决方法

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

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
,

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

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

git difftool -d <something> <something else>

就外部工具的选择而言:

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

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

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

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

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

,

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

git -c diff.tool=whatever ...

这种模式一般适用:如果你想假装配置文件加起来有一些特定的 x 设置为 y,git config -c x=y 可以解决问题。多个 -c 选项聚集在一起并按配置使用。

(我相信这会添加到配置中并依赖于“最后的配置覆盖早期的配置”的东西,因此对于像 remote.remote.fetch 这样的多值设置,如果您需要避免选择用户配置,您目前必须使用修改 $HOME 之类的技巧,这有...缺点。即将发布的 Git 版本提供了跳过系统和用户配置的方法,用于特殊目的,包括 Git 自己的自测。)>

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?