如何在Git仓库的特定状态下显示文件内容?

34

我想展示在特定状态下git仓库中给定路径文件的内容,但我的尝试失败了:

git show f825334150cd4bc8f46656b2daa8fa1e92f7796d:Katana/source/Git/GitLocalBranch.h
fatal: ambiguous argument
'f825334150cd4bc8f46656b2daa8fa1e92f7796d:Katana/source/Git/GitLocalBranch.h': unknown revision or path not in the working tree.
Use '--' to separate paths from revisions

所涉及的提交未修改指定的文件。如何在不考虑文件是否涉及提交的情况下,显示给定状态(由提交哈希指定)中文件的内容?

2个回答

46

可能是您路径规范的问题。

这个命令可以正常工作,它显示了提交 b1b22df407417... 中 Makefile 的版本。

git show b1b22df407417:Makefile

或者当前主分支上的版本

git show master:Makefile

或者在 exper 分支中的当前版本:

git show exper:Makefile

或者在 exper 分支上的先前版本:

git show exper^:Makefile

等等,依此类推


我非常确定路径没有问题。我认为问题在于文件没有被提交修改。任何没有被提交修改的文件都会得到相同的结果。 - richcollins
哦,好的,我以为你选择了特定版本是因为你知道文件是在那个版本中修改的。 - stefanB
我的问题在于我使用了绝对路径:git show <rev>:<absolute path>。另一个答案指出,这个答案可以通过指出应该使用项目相对路径来改进。由于这是最佳答案,因此这将非常有用。 - Guildenstern

5
你使用的语法与git show手册中的示例匹配,但是git似乎暗示你应该这样指定:
# I _don't_ think this is your answer...
git show f825334150 -- Katana/source/Git/GitLocalBranch.h

我肯定已经用过它来运行git log,并且在其手册中有介绍。

但是,我的直觉告诉我,你使用的是绝对路径而不是在git工作树顶部的路径。你需要确保如果你的.git目录位于Katana/source/Git/.git,那么你要截掉.git之前的所有内容,就像这样:

git show f825334150:GitLocalBranch.h

如果您想要在git工作区域之外展示一个git blob,需要按照以下步骤进行:

GIT_DIR=Katana/source/Git git show f825334150:GitLocalBranch.h

这将告诉git它可以在哪里找到您的仓库数据。
重要提示:仔细检查您的路径并确保它们正确。如果您不是从git工作区内运行命令,则可能需要设置GIT_DIR

Katana/source/Git/GitLocalBranch.h 是相对于基本的 Git 目录的路径。 - richcollins
那就对了。f82533 是一个提交吗?你可以通过运行 git cat-file -t f82533 来检查它的类型。 - Mike Seplowitz
1
刚刚检查了一下,当引用提交中未更改的文件时,git show commitHash:path/to/file 对我来说运行良好。 - Mike Seplowitz
“:--`语法有什么区别?” - Moberg
@Moberg <rev>:<path> 是针对 git show 的,而 git log 的使用方法是 git log [<options>] [<revision-range>] [[--] <path>...]。回顾一下,我关于在 git show 中使用 -- 的第一个描述肯定是错误的。 - Mike Seplowitz

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