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

我有一个版本的 .tex文件从一些提交前,我想得到一个副本。我有提交的 sha1散列值,它具有我想要的文件版本。我不想替换文件的当前版本。相反,我只想得到一个单独的副本,它反映了旧版本中的状态。

很多类似的问题都建议使用 git checkout <sha1> -- file.tex,但是这只会给出“ error: pathspec‘ file.tex’不匹配任何已知的 git 文件”

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

这可能吗? 我该怎么做?

36165 次浏览

我认为最好的解决方案是暂时覆盖你的文件:

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

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

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

如果您位于存储库的子目录中,那么 ./是必需的,如果您位于存储库的顶级,那么它可能会被忽略。而且,这在旧版本的 git 中可能不起作用,在这种情况下,您需要显式地提供相对于存储库根目录的文件的完整路径。

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

Workdir $git show version: repo/module/package/code.file > code.file.old

或相对于工作目录的路径:

Package $git show version: ./code.file > workdir/code.file.old

与签出文件相反,show本质上不会改变您的工作区,您可以对输出做任何您喜欢的事情。

信贷到 这个答案,当然看到完整的细节在 手动操作