59

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

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

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

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

4

3 回答 3

91

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

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

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

于 2013-02-21T06:56:44.873 回答
11

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

git checkout <sha1> file.tex
cp file.tex directory
git checkout HEAD file.tex
于 2013-02-21T06:00:06.873 回答
11

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

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

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

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

与检出文件相比,show它本质上不会改变您的工作空间,您可以对输出做任何您喜欢的事情。

归功于这个答案,当然,请参阅手册中的全部详细信息。

于 2018-11-05T20:09:25.130 回答