场景:手残不小心用git stash drop 删除了git stash 储藏里的数据,用git stash list查看储藏里一片空白。删除的比较多,重写很麻烦,只有想办法恢复git stash里的数据。
去网上找办法,很简单,使用 git stash apply 记录id,就可以恢复了。但是!关键点时如何找到那个id!,在几百几千个id中找到你需要的那个id!
记录一下我寻找id恢复数据的过程。
1. 列出所有丢弃的id
git fsck --lost-found 或者git fsck --unreachable
列出来的就是每一个id,这里面就有你drop掉的那个id,你可以使用 git show id 命令看每个id里面的内容。找到内容里是你需要的那个id,就大功告成了。(ps:如果你列出的id只有几个的话,可以一个个的git show 查询内容。)
但是我列出的id,有几百个,一个个的git show 查询内容,显然不可能。
网上的办法就是,编写脚本 根据你丢弃的数据内容关键字,过滤查询到哪个id!但是我不会写脚本!只会一点简单的命令。下面就是我临时抱佛脚学习shell脚本找到那个id的过程。(如果你会shell脚本的话,那这一步对你来说很简答)
2. 找到那个id
使用 git fsck --lost-found >> d:/shell/a.txt 命令,将所有丢弃的id 导入到a.txt文件里
在文件a.txt 文件里,你会得到一行行这样的记录
在excel里将其处理成
一行行这样的记录
git show b01120a00868d23ba9baec240f9b068fe7747b65 >>d:/shell/file/b01120a00868d23ba9baec240f9b068fe7747b65
就是将git show 的内容输出到 以这个id命名的文件里,然后遍历检索文件里的内容。返回那个匹配特定内容的文件名。
dir="D:\gitlab\platform"
cd "$dir" ||exit 1
git show b01120a00868d23ba9baec240f9b068fe7747b65 >>d:/shell/file/b01120a00868d23ba9baec240f9b068fe7747b65
git show b346f098a4383f50d3955648cb8e73a6fa7b074f >>d:/shell/file/b346f098a4383f50d3955648cb8e73a6fa7b074f
git show 4a6d20baf54852746f90ee4882353d38fbc55636 >>d:/shell/file/4a6d20baf54852746f90ee4882353d38fbc55636
先切换到你的git项目目录,再执行。git show 命令,将显示的内容,输入到以该分支名字的文件里。
3. 遍历文件找到那个id
注意搜索的目录,和指定的内容,我是要检索“DownLoad”
# 指定要搜索的目录
search_dir="d:/shell/file"
# 指定要搜索的特定文字
search_text="DownLoad"
# 遍历目录下所有的txt文件
for file in "$search_dir"/*; do
if grep -q "$search_text" "$file"; then
echo "Found the text '$search_text' in the file: $file" >> d:/shell/result.txt
echo "-----------"
fi
done
搜索结果,只能几个id了,可以一一git show了, (因为我指定的内容比较宽泛)
最终找到了需要的那个id,用git stash apply id ,应用到当前分支上,
大功告成!