是否可以将 git 历史恢复到复制和修改的树中?

Is it possible to restore a git history to a copied and modified tree?

我的一位同事以 "wrong" 的方式创建了一个新的 git 存储库,方法是复制树,删除 .git 目录,然后创建一个新的 git init。然后这位同事大幅精简了存储库,删除了一堆文件并重命名了其他文件(在提交任何内容之前)。

在我看来,通过从原始回购到新回购的差异,然后打补丁,应该可以恢复历史记录。

我能够使用

生成这样的差异
diff -ur old new --exclude=".git" > master.patch

然后我几乎通过做

来修补它
git clone old new_old
cd new_old
git checkout master
patch -p 1 < ../master.patch

# Then, if the patch command had worked, I would have done:
cd ..
rm -rf new
mv new_old new

-p 1 告诉它删除存储库目录名称)但它似乎 运行 遇到完全删除的文件的问题。

我预计它也会 运行 遇到重命名文件的问题(例如,从 old_dog.hppnew_dog.hpp)。但我也读过 git

我敢肯定以前有人这样做过,但我找不到任何示例。有没有一种简单的方法可以恢复此存储库中文件的历史记录,或者我只是在浪费时间?

实际上要简单得多。

对于旧的 .git 目录,删除所有文件并将它们替换为新根提交中的所有文件。

然后,如果在新的根提交之上还有任何其他提交,请使用 git format-patch 生成一系列补丁并使用 git am 应用它们。 (您可以改为执行变基,但对于这种情况 IMO 来说,这不必要地复杂)