Git:如何恢复分支中删除的每个文件的最新版本?

标签 git

我有一个包含一个分支的 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/

相关文章:

用于压缩功能分支提交的 Git 别名

python - GitPython:获取远程仓库的最新标签

以前在 Windows 上的 Ubuntu 中的 Android Studio Open Project 说每个文件都已更改

git - docker alpine 9 构建期间的 "Host key verification failed"

git - 如何在 Mac OSX 上获取分支名称的 Git 补全?

git - Git merge --squash 可以保留提交注释吗?

git - 将 SVN 转换为 Git 使用 lfs 保存大文件

自定义 bash 函数的 Git 自动完成

git - 在 Git 中运行预提交 Hook 。有没有办法验证脚本是否正在运行?

ruby-on-rails - 私有(private) repo 正在通过 ansible playbook 克隆,但私有(private) gem 没有安装