如何从Git中的特定版本检索单个文件?

我有一个Git仓库,我想看看几个月前的一些文件。 我发现那个date的版本是27cf8e84bb88e24ae4b4b3df2b77aab91a3735d8 。 我需要看看一个文件是什么样子,并保存到一个文件。

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

 git-show 27cf8e84bb88e24ae4b4b3df2b77aab91a3735d8 my_file.txt 

但是,这个命令显示一个diff而不是文件内容。 我知道我以后可以使用像PAGER=cat和redirect输出到一个文件,但我不知道如何去实际的文件内容。

基本上,我正在寻找像svn猫的东西。

为了完成你自己的答案,语法的确是

 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 ”时, 总是从存储库的根目录指定一个path ,而不是当前的目录位置。

(虽然Mike Morearty提到,至less在git 1.7.5.4中,可以通过在path的开头加上“ ./ ”来指定一个相对path,例如:

 git show HEAD^^:./test.py 


在git1.5.x之前,这是用一些pipe道完成的:

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

git cat-file blob <file-SHA1>
捕获一个文件,因为它已经在一个特定的版本(类似于svn cat)中提交。 使用git ls-tree来检索给定文件sha1的值

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

git-ls-tree在修订版$ REV中列出了$ file的对象ID,这个被从输出中截取出来,并用作git-cat-file的参数,它应该被称为git-cat-object,该对象标准输出。


注意:既然Git 2.11(2016年第四季度),你可以应用一个内容filter到git cat-file输出!

请参阅提交3214594 , 提交7bcf341 (2016年9月9日), 提交7bcf341 (2016年9月9日),并提交b9e62f6 , 提交16dcc29 (2016年8月24日)作者: Johannes Schindelin( dscho ) 。
(由Junio C gitster合并- gitster -在承诺7889ed2 ,2016年9月21日)

cat-file :支持--textconv / --filters批处理模式下的--filters

尽pipe“ git hash-objects ”是一种将文件系统数据stream引入Git对象存储的工具,它允许执行“外部世界到Git”的转换(例如,在线转换和清理filter的应用),并且它在很早的时候就具有默认的function,它的反向操作“ git cat-file ”,它从Git对象存储中获取对象并将其外部化外部世界,缺乏运行“Git-to-outside-world”的机制,

 git config diff.txt.textconv "tr A-Za-z N-ZA-Mn-za-m <" git cat-file --textconv --batch 

注意:“ git cat-file --textconv ”最近(2017年)开始进行git cat-file --textconv ,在Git 2.15(2017年第4季度)

参见Jeff King( peff )的 commit cc0ea7c (2017年9月21日) 。
(由Junio C gitster合并- gitster – in commit bfbc2fc ,2017年9月28日)

如果您希望当前分支中的文件内容replace/覆盖当前分支中的文件内容,可以使用以下命令来完成:

 git checkout 08618129e66127921fbfcbc205a06153c92622fe path/to/file.txt 

要么

 git checkout mybranchname path/to/file.txt 

然后,您必须提交这些更改才能使其在当前分支中生效。

您需要提供文件的完整path:

 git show 27cf8e84bb88e24ae4b4b3df2b77aab91a3735d8:full/repo/path/to/my_file.txt 

最简单的方法是写:

 git show HASH:file/path/name.ext > some_new_name.ext 

哪里:

  • HASH是git修订版SHA1哈希编号
  • file / path / name.ext是您正在查找的文件的名称
  • some_new_name.ext是保存旧文件的path和名称

例:

 git show 27cf8e84bb88e24ae4b4b3df2b77aab91a3735d8:my_file.txt > my_file.txt.OLD 

这将从版本b0d78b4中保存my_file.txt作为名为my_file.txt.OLD的新文件

使用GIT 2.4.5进行testing

如果要检索已删除的文件,可以使用HASH~1 (在指定的HASH之前提交一个)。

例:

 git show 27cf8e84bb88e24ae4b4b3df2b77aab91a3735d8~1:deleted_file.txt > deleted_file.txt 

并很好地转储到一个文件(在Windows中至less) – git Bash:

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

"引号是需要的,所以它保留了换行符

在Windows中,使用Git Bash:

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

这将帮助您在提交之间获取所有已删除的文件,而无需指定path,如果删除了大量文件,则可以使用该文件。

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

通过检出以前的提交和复制文件,从前一个提交中获取文件。

  • 注意你在哪个分支:git分支
  • 签出你想要的以前的提交: git checkout 27cf8e84bb88e24ae4b4b3df2b77aab91a3735d8
  • 将您想要的文件复制到临时位置
  • 签出你开始的分支: git checkout theBranchYouNoted
  • 复制放置在临时位置的文件
  • 把你的改变提交到git: git commit -m "added file ?? from previous commit"
Interesting Posts