如何在git存储库中获取旧版本文件的副本?

时间:2013-02-21 05:54:48

标签: git git-checkout

我有一个来自多个提交前的.tex文件版本,我希望得到一份副本。我有提交的sha1哈希值,它具有我想要的那个文件的版本。我不想替换当前版本的文件。相反,我想获得一个单独的副本,反映它在旧版本中的状态。

许多类似的问题建议使用git checkout <sha1> -- file.tex,但这只是一直给出“错误:pathspec'file.tex'与git已知的任何文件都不匹配。”

我感兴趣的文件最初存在于存储库的顶级目录中。我目前在存储库的子目录中尝试运行此命令,以便在子目录中获取旧版本的file.tex。

这可能吗?我怎么能这样做?

3 个答案:

答案 0 :(得分:62)

您可以使用git cat-file将文件内容转储到标准输出,并将其重定向到您想要的目的地:

git cat-file -p <sha1>:./file.tex > wherever.tex

如果您位于存储库的子目录中,则./是必需的,如果您位于存储库的顶层,则可以省略它。此外,这可能不适用于旧版本的git,在这种情况下,您需要显式提供相对于存储库根目录的文件的完整路径。

答案 1 :(得分:9)

我认为最好的解决方案是暂时覆盖您的文件。在您的存储库的顶级:

git checkout <sha1> file.tex
cp file.tex directory
git checkout file.tex

答案 2 :(得分:1)

git show 与绝对存储库路径一起使用:

  

workdir $ git显示修订版本:repo / module / package / code.file> code.file.old

或相对于当前目录的路径:

  

package $ git show版本:./ code.file> workdir / code.file.old

与检出文件相反,show不会本质上更改您的工作区,您可以对输出执行任何操作。

贷记到this answer,当然,请在manual中查看全部详细信息。