git - Git如何从特定版本检索单个文件?

  显示原文与译文双语对照的内容

我有一个Git仓库,我想看看几个月前有些文件是怎么看的。 我在那个日期找到了修订版,它是: 27cf8e84bb88e24ae4b4b3df2b77aab91a3735d8 我需要看看一个文件的样子,并将它保存到文件中。

我使用 gitk 查看了该文件,但它没有保存它的选项。 我试过 命令行 工具,最接近的是:


git-show 27cf8e84bb88e24ae4b4b3df2b77aab91a3735d8 my_file.txt

但是,这里命令显示了一个差异而不是文件内容。 我知道我以后可以使用 PAGER=cat,并将输出重定向到一个文件,但不知道如何到达实际的文件内容。

基本上,我正在寻找类似于 cat的东西。

时间:

要完成你自己的回答,语法实际上是


git show object
git show $REV:$FILE
git show somebranch:from/the/root/myfile.txt
git show HEAD^^^:test/test.py

命令采用常用的修订方式,这意味着你可以使用以下任何一种:

  1. 分支名称( 作为建议由灰 )
  2. HEAD + x ^ 字符数
  3. 给定版本的SHA1哈希
  4. 给定SHA1哈希的前几个( 可能 5 ) 字符

它必须记住,当使用提示" git show",始终指定一个路径根目录中的存储库,而不是你当前的目录位置。

( 尽管 Morearty 提到,至少在 git 1.7.5.4 中,你可以通过将" ./"放在路径--的开头来指定相对路径,例如:


git show HEAD^^:./test.py

)


在 git1.5. x 之前,使用了一些管道:

git ls-tree <rev>
在提交中显示一个或者多个'blob'对象的列表

git cat-file blob <file-SHA1>
cat 在特定版本( 类似于 svn cat ) 中提交文件。 使用 git ls-tree检索给定file-sha1的值


git cat-file -p $(git-ls-tree $REV $file | cut -d"" -f 3 | cut -f 1)::

git-ls-tree $file的列出了一个inf文件被用来在修订 $REV, 这是从一个参考点移动到输出和用作参数来 git-cat-file,这实际上应该称为 git-cat-object,并简单地将该对象转储到标准输出。

以下为我工作:


git checkout 08618129e66127921fbfcbc205a06153c92622fe -- [full/path]

以一个例子为例:


git checkout mybranchname ~/src/myapp/myfile.txt

并将它的妥善转储到文件( 至少在 Windows 中) - git Bash:


$ echo"`git show 60d8bdfc:src/services/LocationMonitor.java`">> LM_60d8bdfc.java

需要 " 引号以便它保留换行符

这将帮助你在提交时获取所有已经删除的文件,而不指定路径,如果有大量文件被删除。


git diff --name-only --diff-filter=D $commit~1 $commit | xargs git checkout $commit~1

在 Windows 中,使用 Git Bash:

  • 在你的工作区中,将dir更改为文件所在的文件夹
  • git show cab485c83b53d56846eb883babaaf4dff2f2cc46:./your_file.ext> old.ext

通过checking-out上一次提交和复制文件从文件中获取文件。

  • 请注意你所在的分支: yf_terminology_git branch@#@#@#git branch_yf_terminology
  • 签出你想要的前一个提交: git checkout 27cf8e84bb88e24ae4b4b3df2b77aab91a3735d8
  • 将你想要的文件复制到临时位置
  • 检查你启动的分支: git checkout theBranchYouNoted
  • 将文件复制到临时位置
  • 将你的更改提交到 git: git commit -m"added file?? from previous commit"
...