我有一个Git存储库,我想看看几个月前一些文件的样子。我找到了那个日期的修订本;这是27 cf8e84bb88e24ae4b4b3df2b77aab91a3735d8。我需要看到一个文件看起来像什么,并将其保存为(“新”)文件。

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

git-show 27cf8e84bb88e24ae4b4b3df2b77aab91a3735d8 my_file.txt

但是,该命令显示的是一个差异,而不是文件内容。我知道我可以稍后使用类似PAGER=cat的东西并将输出重定向到一个文件,但我不知道如何获得实际的文件内容。

基本上,我在找svn cat之类的东西。


当前回答

最简单的方法是这样写:

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

地点:

HASH是Git修订的SHA-1哈希值 文件/道路/的名字。Ext是您要查找的文件的名称 some_new_name。Ext是保存旧文件的路径和名称

例子

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

这将把修订版27cf8e中的my_file.txt保存为一个名为my_file.txt. old的新文件

它是用Git 2.4.5测试的。

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

例子:

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

其他回答

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

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

并且很好地将它转储到一个文件(至少在Windows上)- Git Bash:

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

引号是必需的,所以它保留了换行符。

如果您更喜欢使用GUI来完成此操作,如果您知道文件大约在何时被更改,则以下操作将有效。

在安装了Git扩展的Visual Studio上:

Git ->查看分支历史 右键单击文件被更改的提交,然后选择查看提交详细信息 在右侧的更改列表中,单击感兴趣的文件。您将看到更改前后完整文件内容的并排比较。只需选择所有并复制文件内容,并粘贴到任何你想要的地方。

最简单的方法是这样写:

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

地点:

HASH是Git修订的SHA-1哈希值 文件/道路/的名字。Ext是您要查找的文件的名称 some_new_name。Ext是保存旧文件的路径和名称

例子

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

这将把修订版27cf8e中的my_file.txt保存为一个名为my_file.txt. old的新文件

它是用Git 2.4.5测试的。

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

例子:

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

使用git show $REV:$FILE,正如其他人已经指出的那样,可能是正确的答案。我发布了另一个答案,因为当我尝试这种方法时,我有时会从git得到以下错误:

fatal: path 'link/foo' exists on disk, but not in 'HEAD'

当文件路径的一部分是符号链接时,就会出现这个问题。在这些情况下,git show $REV:$FILE方法将不起作用。复制步骤:

$ git init .
$ mkdir test
$ echo hello > test/foo
$ ln -s test link
$ git add .
$ git commit -m "initial commit"
$ cat link/foo
hello
$ git show HEAD:link/foo
fatal: path 'link/foo' exists on disk, but not in 'HEAD'

问题是,像realpath这样的实用程序在这里没有帮助,因为符号链接可能在当前提交中不再存在。我不知道一个好的通解。在我的例子中,我知道符号链接只能存在于路径的第一个组件中,所以我两次使用git show $REV:$FILE方法解决了这个问题。这是可行的,因为当git在符号链接上使用$REV:$FILE时,它的目标将被打印:

$ git show HEAD:link
test

而对于目录,该命令将输出一个头文件,后面跟着目录内容:

$ git show HEAD:test
tree HEAD:test

foo

所以在我的例子中,我只是检查了第一次调用git show $REV:$FILE的输出,如果它只有一行,那么我用结果替换了我的路径的第一个组件,以通过git解析符号链接。