Git:将整个文件输出到标准输出

49

有没有一条命令可以接受引用和文件路径,并输出该提交时文件的完整内容到STDOUT?

例如,像这样的东西:

git show-me-the-file HEAD~2 some/file | do_something_with_piped_output_here

8
git cat-file -p HEAD~2:some/file 的翻译是:获取 HEAD 的父节点的第二个节点中 some/file 文件的内容。 - jthill
谢谢 jthill - 这也行。把它变成答案我会点赞的。 - Joel
2
这是我用它的方式:meld <(git cat-file -p HEAD:some/file) <(git cat-file -p master:some/file); 用于在meld中查看文件差异。也许有更好的方法,但这似乎运行良好。 - Joel
这里有一个链接:http://nathanhoad.net/how-to-meld-for-git-diffs-in-ubuntu-hardy - ellotheth
@ellotheth 很有趣。谢谢。 - Joel
@ellotheth @Joel 如果你曾经在没有GUI的情况下(例如:使用ssh -X)工作,最好将git difftool设置为指向meld。这样,当你需要时,就可以保留一个非GUI的diff工具供git使用。 - drevicko
3个回答

65

git show

例如:

git show HEAD:./<path_to_file>


3
“| cat” 不是必须的(除非你想要防止分页程序启动)。 - Suzanne Soy
3
":"很重要,否则你将看到一个差异而不是完整的文件。 - Alex KeySmith
不要像我一样混淆这个非常特定的语法与 git show HEAD -- /<path_to_file>。你会得到补丁文件语法,我怀疑你不想要。 - Sridhar Sarnobat

15

git show <ref spec>:<path>

例如,如果您想在提交点9be20d1bf62中查看文件,则执行以下操作:

git show 9be20d1bf62:a/b/file.txt

如果您想查看特定分支上的文件:

git show <branch name>:<path>


一个问题是show(和cat-file)似乎不关心core.autocrlf=true。输出似乎总是Linux风格,因此,当使用命令输出与磁盘上的文件进行比较时,我总是得到EOL差异。我赞成将Linux EOL作为默认设置,但如果有一个标志像--respect-autocrlf,那就好了,这将在autocrlf=true时导致CRLF输出,在autocrlf=false时导致LF输出。 - Gur

4
您需要使用 git showgit archive 命令来实现此功能。其中,git show 命令更加适用于将文件输出到标准输出流中。
# Show .gitignore from revision before this one.
git show HEAD^:.gitignore

冒号前的部分是根据gitrevisions(7)形成的树状结构,而后半部分是相对于您的git工作树顶部的路径。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接