我知道这是一个老帖子,但我想在这里补充一些内容。
使用后。
$ git fsck --cache --no-reflogs --lost-found --unreachable HEAD
我们得到了数千个文件的列表(就像我的情况一样),看起来不可能手动检查所有的文件,因此我们可以按照任何适合您的方式过滤列表,以仅找到 blob 文件。在我的情况下,我使用 Python 并将 git fsck 的输出从控制台复制到文件中,然后读取该文件以获取行列表。
with open("lost_files.txt") as file:
lost_files = file.readlines()
然后进行筛选以分离blob类型的内容。
[line.split(' ')[-1].strip() for line in lost_files if "blob" in line]
结果是哈希列表。然后进入控制台并声明一个变量FILES,将上面生成的哈希列表粘贴到这里。FILES=('5c2d8667ef8abbd7e114d2f9b61ee840b034e56f' ....... '6dad86cd9c7a80ff5c3cd1d3222d2f8228dc18cf'),因为有近5000个文件,所以只需在控制台中编写一个简单的循环即可。
for lost_file in "${FILES[@]}"; do git show $lost_file > lost/lost_file_$lost_file.txt; done
作为结果,我在丢失的目录中得到了5K个文件。
然后只需打开每个文件并使用grep命令来查找所需数据。
对于我而言,下面是相关脚本(在处理功能时,我试图使用有意义的命名方式,因此我只添加了按关键字过滤的筛选器)。
import os
lost_files_names = os.listdir("lost")
names = []
for file in lost_files_names:
with open(f"lost/{file}", "rb") as data:
temp = data.readlines()
for x in temp:
if b"my_keyword" in x:
names.append(file)
for x in set(names):
print(x)
终于,我得到了包含10个文件的输出,并在短时间内成功地恢复了不小心丢失的未提交代码(感谢上帝,我已经使用git add)。