我有一个包含一个分支的 Git 存储库,在一年多的时间里,数千个文件经历了一个生命周期,每个文件最初都被添加,然后修改了多次,最后被删除。
我想在删除之前检索存储库中存在的每个文件的最新版本,以便将每个文件存档到单独的位置。我不需要在 Git 中恢复那些旧版本,我所需要做的就是将每个文件的最新版本(尊重其相应的相对路径)转储到存储库外部的某个目录。
实现这一目标的好方法是什么?
(我见过的其他问答涉及如何恢复由单个提交或几次提交删除的单个文件或子目录,而不是如何对数千次提交中的数千个文件执行此操作。)
最佳答案
我可能会从以下开始:
git log --format='' --full-history --name-status --diff-filter=D
这应该列出所有已删除的文件。它不会捕获提交哈希,尽管如果与更智能的脚本集成,它可以捕获提交哈希。然后获取文件被删除的提交 - 当文件被删除时,假设它在触及路径的最后一次提交中被删除 - 并使用 git show deleted_in^:filename
获取删除之前的文件内容。
此 bash 片段应恢复“tmp”中已删除的文件。进行相关更改以涵盖“在分支中”的含义。我建议添加 -n 100
或类似的测试。 YMMV。
git log --format='' --full-history --name-status --diff-filter=D |
cut -f2 |
(while read file; do (
c=$(git rev-list head --max-count=1 -- "$file");
echo "restoring '$file' deleted in $c";
mkdir -p "tmp/$(dirname \\"$file\\")";
git show $c^:"$file" > "tmp/$file";
); done)
更智能的脚本可能会捕获文件被删除的提交和文件名以避免二次 git rev-list
使用上面。然后,这样的脚本将考虑确保它仍然使用修改文件的最后一次提交,上面的脚本中不存在这个问题,因为 rev-list 用法仅返回最后一次提交。
关于Git:如何恢复分支中删除的每个文件的最新版本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70647053/