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

jbr*_*aud 40 git git-checkout

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

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

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

这可能吗?我怎样才能做到这一点?

qqx*_*qqx 64

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

git cat-file -p <sha1>:./file.tex > wherever.tex
Run Code Online (Sandbox Code Playgroud)

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

  • 请注意,与许多其他git命令不同,文件名(此处为"file.tex")必须是git repo根目录中的名称.因此,如果你想要foo/file.tex并且你在子目录foo中你无法输入上面的内容,你必须输入<sah1>:foo/file.tex,尽管你已经在foo中了. (3认同)
  • 该语法令人难以置信!如果这是软件开发工具和软件开发的未来,那么我们将面临文明的彻底崩溃。随着软件的普及,有多少人可以处理这种高水平的认知超负荷? (2认同)

Wil*_*uta 9

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

git checkout <sha1> file.tex
cp file.tex directory
git checkout HEAD file.tex
Run Code Online (Sandbox Code Playgroud)

  • 最后一个命令需要是`git checkout HEAD file.tex`.第一个checkout命令将修改索引以及工作树副本,因此checkout而不指定修订版仍将使用旧版本. (4认同)

gws*_*gws 9

使用git show具有绝对的版本库路径:

workdir$ git show 修订:repo/module/package/code.file > code.file.old

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

package$ git show 修订:./code.file > workdir/code.file.old

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

归功于此答案,当然,请参阅手册中的完整详细信息。