协慌网

登录 贡献 社区

如何从 Git 中的特定修订中检索单个文件

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

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

git-show 27cf8e84bb88e24ae4b4b3df2b77aab91a3735d8 my_file.txt

但是,此命令显示 diff 而不是文件内容。我知道我以后可以使用像PAGER=cat和重定向输出到文件的东西,但我不知道如何获得实际的文件内容。

基本上,我正在寻找类似svn 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 ” 时, 始终指定来自存储库根目录的路径 ,而不是当前目录位置。

(虽然Mike 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 检索给定文件 - 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,并且只是转储 stdout 的那个对象。


注意:自 Git 2.11(2016 年第 4 季度)起,您可以将内容过滤器应用于git cat-file输出!

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

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

尽管 “ git hash-objects ” 是一种将文件系统数据流放入 Git 对象存储库的工具,但它允许执行 “外部世界到 Git” 的转换(例如,结束时)行转换和清理过滤器的应用),默认情况下从早期就开始使用它的反向操作 “ 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 ” 最近启动了 segfaulting(2017),已在 Git 2.15(2017 年第 4 季度)中更正

请参阅Jeff King( peff 提交 cc0ea7c (2017 年 9 月 21 日
(由Junio C gitster合并- gitster - in commit bfbc2fc ,2017 年 9 月 28 日)

如果您希望使用先前提交或其他分支中的文件内容替换 / 覆盖当前分支中的文件内容,则可以使用以下命令执行此操作:

git checkout 08618129e66127921fbfcbc205a06153c92622fe path/to/file.txt

要么

git checkout mybranchname path/to/file.txt

然后,您必须提交这些更改,以使它们在当前分支中有效。

您需要提供文件的完整路径:

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