我运行了以下命令:
git add .
由于文件很多(> 10TB),所以添加需要时间。中途我不小心删除了一些文件(我需要恢复)。所以,如果我在终端中执行“Ctrl + C”(中断 Git)。
会发生什么?
- git 中将会有部分添加(我可以使用 git checkout 恢复一些文件?)
- git 中不会添加任何文件。
Thanks,
在我的实验中,一个被中断的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 就给了我一个文件的内容。不过,这使用起来并不有趣,因为您获得的是没有文件名的文件内容。不幸的是,如果您有机会进行提交,文件名将存储在索引中以及更持久的结构中,但对于在中断期间创建的 blob,该信息尚不可用。git add
.
这是一个脚本,它将在一个带有分隔符的文件中列出所有 blob,这可能会让您的生活更轻松一些:
File 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 $_");
}
Run
chmod +x list-blobs.pl
list-blobs.pl | less
你会看到在中断之前 Git 实际上在 blob 中存储了哪些对象git add
.
更简单:使用https://github.com/ethomson/git-recover作者爱德华·汤姆森在下面的评论中分享了这一点。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)