代码之家  ›  专栏  ›  技术社区  ›  Milan BabuÅ¡kov

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

  •  711
  • Milan BabuÅ¡kov  · 技术社区  · 15 年前

    我有一个Git存储库,我想看看几个月前一些文件的外观。我在那一天找到了修订版 27cf8e84bb88e24ae4b4b3df2b77aab91a3735d8 . 我需要看看一个文件是什么样子的,还需要把它保存到一个文件中。

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

    git-show 27cf8e84bb88e24ae4b4b3df2b77aab91a3735d8 my_file.txt
    

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

    基本上,我在找 猿猴猫 .

    8 回复  |  直到 6 年前
        1
  •  630
  •   VonC    7 年前

    要完成自己的答案,语法确实是

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

    该命令采用常规的修订样式,这意味着您可以使用以下任何一种:

    1. 分支名称(AS) suggested 通过 ash )
    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>
    在特定版本中提交的文件(类似于SVN 猫) 使用git ls树检索给定文件的值-sha1

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

    git ls tree在revision$rev中列出了$file的对象ID,这是从输出中删除的,并用作git cat文件的参数,该文件实际上应该称为git cat对象,只需将该对象转储到stdout。


    注:由于Git2.11(2016年第4季度),您可以将内容过滤器应用于 git cat-file 输出!

    commit 3214594 , commit 7bcf341 (09 SEP 2016) 提交7BCF31 (2016年9月9日),以及 commit b9e62f6 , commit 16dcc29 (2016年8月24日) Johannes Schindelin ( dscho ) .
    (合并) Junio C Hamano -- gitster -- 在里面 commit 7889ed2 ,21 SEP 2016

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

    即使“ git hash-objects 它是一个工具,用于获取文件系统上的数据流并将其放入Git对象存储区,允许执行“外部世界到Git”的转换(例如行末转换和干净过滤器的应用),默认情况下,它从很早就启用了该功能,它的反向操作。 git cat-file 它从Git对象存储中获取一个对象,并将其外部化以供外部世界使用,但缺少运行“Git到外部世界”的等效机制。

    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季度)

    commit cc0ea7c (2017年9月21日) Jeff King ( peff ) .
    (合并) 哈马诺郡-- 吉斯特 —— 在里面 commit bfbc2fc ,28 SEP 2017

        2
  •  441
  •   c-a    8 年前

    如果你愿意 替换/覆盖 当前分支中的文件内容与以前提交或其他分支中的文件内容相同,可以使用以下命令执行此操作:

    git checkout 08618129e66127921fbfcbc205a06153c92622fe path/to/file.txt
    

    git checkout mybranchname path/to/file.txt
    

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

        3
  •  134
  •   Peter Mortensen sifr_dot_in    6 年前

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

    git show 27cf8e84bb88e24ae4b4b3df2b77aab91a3735d8:full/repo/path/to/my_file.txt
    
        4
  •  72
  •   jmarceli    6 年前

    这个 最容易的 方法是写:

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

    哪里:

    • 搞砸 是git修订版sha-1哈希编号
    • 文件/路径/名称.ext 是您要查找的文件的名称
    • 一些新的扩展名 是保存旧文件的路径和名称

    例子

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

    这将节省 MyoFiel.Txt 从修订 2CF8E 作为名为的新文件 我的老朋友

    用Git 2.4.5测试。

    如果你想 检索已删除的 您可以使用的文件 HASH~1 (在指定哈希之前提交一次)。

    例子:

    git show 27cf8e84bb88e24ae4b4b3df2b77aab91a3735d8~1:deleted_file.txt > deleted_file.txt
    
        5
  •  9
  •   Alessandro Jacopson    9 年前

    在Windows中,使用Git-Bash:

    • 在工作区中,将dir更改为文件所在的文件夹。
    • git show cab485c83b53d56846eb883babaaf4dff2f2cc46:./your_file.ext > old.ext
        6
  •  6
  •   Peter Mortensen sifr_dot_in    6 年前

    为了很好地将它转储到一个文件中(至少在Windows上),Git bash:

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

    这个 " 需要引号,因此它保留新行。

        7
  •  3
  •   Adrian Gunawan    10 年前

    这将帮助您在提交之间获取所有已删除的文件,而不指定路径,如果删除了大量文件,这很有用。

    git diff --name-only --diff-filter=D $commit~1 $commit | xargs git checkout $commit~1
    
        8
  •  -2
  •   Marvin Pinto    13 年前

    通过签出以前的提交并复制文件,从以前的提交中获取文件。

    • 注意你在哪个分支机构:Git分支机构
    • 签出所需的上一个提交: git checkout 27cf8e84bb88e24ae4b4b3df2b77aab91a3735d8
    • 将您想要的文件复制到临时位置
    • 签出从以下位置开始的分支: git checkout theBranchYouNoted
    • 复制到您放置在临时位置的文件中
    • 将更改提交给Git: git commit -m "added file ?? from previous commit"