是否可以将 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.hpp
到 new_dog.hpp
)。但我也读过 git
我敢肯定以前有人这样做过,但我找不到任何示例。有没有一种简单的方法可以恢复此存储库中文件的历史记录,或者我只是在浪费时间?
实际上要简单得多。
对于旧的 .git
目录,删除所有文件并将它们替换为新根提交中的所有文件。
然后,如果在新的根提交之上还有任何其他提交,请使用 git format-patch
生成一系列补丁并使用 git am
应用它们。 (您可以改为执行变基,但对于这种情况 IMO 来说,这不必要地复杂)
我的一位同事以 "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.hpp
到 new_dog.hpp
)。但我也读过 git
我敢肯定以前有人这样做过,但我找不到任何示例。有没有一种简单的方法可以恢复此存储库中文件的历史记录,或者我只是在浪费时间?
实际上要简单得多。
对于旧的 .git
目录,删除所有文件并将它们替换为新根提交中的所有文件。
然后,如果在新的根提交之上还有任何其他提交,请使用 git format-patch
生成一系列补丁并使用 git am
应用它们。 (您可以改为执行变基,但对于这种情况 IMO 来说,这不必要地复杂)