我有一个继承的 repo,它是通过从 github 下载代码 zip 创建的,而不是克隆的,几乎所有更改都是在第一次提交之前进行的。
我找到了它是在哪个提交处创建的(我认为),在克隆 github repo 后,我从该提交创建了一个分支。我还将不完整的 repo 作为远程添加到从 github 克隆的完整 repo 中。
现在我想从不完整的存储库中获取提交并将它们重新定位到完整存储库中的分支上,最好同时保留提交的先前所有权。
答案1
首先暂时将两个历史“嫁接”在一起
.git/info/grafts
。这会将虚假的父级添加到任何给定的提交。语法是:commit-id parent-id [parent-id...]
假设你的最老的commit 是
1234567890
,并且你认为它是基于 GitHub repo 的 commitabcdefghijkl
。这样,你的.git/info/grafts
文件应该如下所示:1234567890 abcdefghijkl
请注意,您必须使用完整的 20 个字符的提交 ID,不是缩短的。
(使用“替换对象”和 也可以实现相同的效果
git replace --graft
。机制不同,但最终结果相同。)使用
git log --stat --decorate
来确保你做对了。你应该在 旁边看到一个“(嫁接)”装饰1234567890
。最后,运行
git filter-branch abcdefghijkl..HEAD
将嫁接物“烘焙”并使其永久化。此后,原木应该看起来完全相同,但“(嫁接)”标记应该会消失。您.git/info/grafts
也可以删除。请注意,这将改变所有提交 ID,直至(包括)嫁接的提交。