如果我中断git add命令会怎样?

时间:2019-01-17 13:30:49

标签: git

我运行了以下命令:

git add . 由于文件很多(> 10TB),因此添加时间很长。中途我不小心删除了一些文件(需要恢复)。因此,如果我在终端中执行“ Ctrl + C”(中断Git)。

会发生什么?

  1. 会有部分添加git(我可以使用git checkout恢复一些文件吗?)
  2. 不会在git中添加任何文件。

谢谢

1 个答案:

答案 0 :(得分:5)

在我的实验中,中断的git add在索引中什么都没有保留(您可以使用git status进行确认),但是它的确将其创建的所有blob保留在其内部结构中,因此可能存在一些可以恢复的文件。 请查看https://git-scm.com/book/en/v2/Git-Internals-Git-Objects,以获取有关从Git的内部Blob中提取文件的信息。

我以这种方式恢复了一个文件:

> find .git/objects -type f
...
.git/objects/ac/a6e96aaf9492a2ee8f9ef51f0197ad56436fd4
...

> git cat-file -p aca6e96aaf9492a2ee8f9ef51f0197ad56436fd4 > file1

请注意,块ID是目录名ac加上blob文件名a6e96...,以生成aca6e96...

这样,Git给了我一个文件的内容。但是,这不会很有趣,因为您得到的文件内容中没有文件名。不幸的是,如果您有机会进行提交,文件名将存储在索引中,并且存储在更持久的结构中,但是该信息尚无法用于git add中断期间创建的Blob。 / p>

这是一个脚本,它将用分隔符在一个文件中列出所有blob,这可能会使您的生活更轻松:

文件list-blobs.pl

#!/usr/bin/perl

open BLOBS, "find .git/objects -type f |";
while (<BLOBS>) {
   chop;
   s#.*(..)/#\1#;
   print "BLOB $_\n";
   system("git cat-file -p $_");
}

运行

chmod +x list-blobs.pl    
list-blobs.pl | less

,您将看到Git在中断git add之前实际上存储在blob中的对象。

更简单:在下面的评论中使用其作者爱德华·汤姆森(Edward Thomson)共享的https://github.com/ethomson/git-recover