如何在git存储库中找到未修改文件的路径


我修改了一个二进制文件。修改后的二进制文件的路径是textures/concrete01.tex。我想打开未修改的版本,并对它们进行视觉比较。在哪里可以找到未修改的文件?

在Git中,有多种方法可以从任何特定的提交中提取任何特定的文件。

最简单、最直接的方法是使用git checkout,但git checkout将其结果写入索引和/或工作树。由于您现有的、已修改但尚未提交的文件已经在工作树中,正如Roland Smith在回答中指出的那样,您需要将该文件保存到其他位置,然后再将其覆盖到工作树中。

不过,有一种非常简单的方法可以在不使用git checkout的情况下从提交中提取或查看任何文件,包括二进制文件。只需使用git show来命名提交和路径,如果需要的话,可以使用shell重定向使结果输出转到某个任意路径:

git show HEAD:textures/concrete01.tex > /tmp/original

例如。然后,您可以使用任何可用的工具来比较两者。请注意,HEAD一如既往地命名当前提交。如果您希望获得在提交badf00d中或在分支zorg顶端的提交中找到的版本,可以分别使用git show badf00d:textures/concrete01.texgit show zorg:textures/concrete01.tex

有一个警告不适用于您的特定情况:以这种方式使用git show会跳过git checkout将基于文件的.gitattributes条目应用的任何过滤(污迹过滤器和行尾转换)。假设文件是二进制的,那么几乎可以肯定的是,您既没有也不想要任何这样的过滤。如果没有过滤器,跳过它——即获得未经修改的原始文件内容——显然与不跳过它具有相同的效果,后者也获得未经更改的原始文件属性。

(除了git show技术之外,您还可以使用临时工作树,例如git cat-file -p来提取任意文件。但git show是供人类使用的命令,而不是自动脚本。)

将修改后的textures/concrete01.tex复制到回购中的某个位置。然后git checkout textures/concrete01.tex得到未修改的版本。

现在,您可以将两者加载到查看器中并进行比较。

如果要保留更改,请将修改后的纹理复制回repo并提交。


如果你经常有这些差异,你可以设置一个自定义的差异过滤器,如下所述。

有一种为二进制文件生成diff的机制。diff属性。您可以在.gitattributes中放入以下内容:

*.tex binary
*.tex diff=texture

然后在.gitconfig中,您可以定义一个过滤器。

[diff "texture"]
command = texture_differ

texture_differ程序将使用七个参数调用,包括旧文件和新文件。参见git手册中的GIT_EXTERNAL_DIFF

应该输出文件之间的文本差异。但我想也可以在查看器中并排显示这两个文件。

最新更新