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

时间:2017-01-14 12:48:44

标签: git

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

2 个答案:

答案 0 :(得分:1)

将修改后的textures/concrete01.tex复制到您的仓库中。然后git checkout textures/concrete01.tex获取未修改的版本。

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

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

如果您经常遇到这些差异,可以按照以下说明设置自定义差异滤镜。

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

*.tex binary
*.tex diff=texture

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

[diff "texture"]
    command = texture_differ

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

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

答案 1 :(得分:1)

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

最简单,最直接的方法是使用git checkout,但git checkout将其结果写入索引和/或工作树。由于您现有的,已修改但尚未提交的文件已经工作树中,因此Roland Smith notes in his answer需要保存该文件。在工作树中覆盖它。

但是,有一种非常简单的方法可以使用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是要使用的命令由人而不是自动脚本。)