我运行了以下命令:
git add .
由于文件很多(> 10TB),因此添加时间很长。中途我不小心删除了一些文件(需要恢复)。因此,如果我在终端中执行“ Ctrl + C”(中断Git)。
会发生什么?
谢谢
答案 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。