我想我可以帮助你解决这个问题,因为我以前需要做类似的事情。
缺点是我的解决方案需要重写一些历史记录。如果你有很多合作者,这将是痛苦的,因为每个人的历史都会改变。我所知道的实际上没有任何解决方法,因为即使像在当前根之前添加父提交这样简单的操作也会更改提交消息或我们的旧根,这会更改其 SHA,这会影响其子项的父字段,这会更改其 SHA,依此类推。
通过查看您在 github 上的存储库,您似乎只有几个贡献者,所以这并不是那么麻烦。
我还假设https://github.com/MinIenM/BAG-Extract 的包存储库在您阅读后没有进展,从阅读您的提交日期和 BAG-Extract 提交的日期来看,我认为是这种情况。
由于听起来您的目标只是表扬,因此子树合并可能适合您。
我们基本上会做以下事情:
- 读入 BAG-Extract 作为新分支。它不会有共同的历史。
- 确定您在历史记录中的哪个位置引入了 bag 子目录。我们称之为“bagin”
- 添加一个新的合并提交,它将最后一个 BAG-Extract 提交和来自 (2) 的提交作为父项。这将是一个子树合并,所以想法是两个父级的不同之处仅在于一个以子树为前缀(例如 bag/)
- 将所有帖子“bagin”历史记录重新定位到此合并对象。
这里有一些代码可以做到这一点。为了安全起见,我会将内容克隆到一个新的存储库中,如果事情没有按计划进行,您可以将其丢弃
git clone git@github.com:milovanderline/NLExtract
git log -- bag #Identify the first commit where "bag" enters. It starts with 78575
git checkout 78575 -b bagin
git remote add bag git@github.com:MinIenM/BAG-Extract
git fetch bag
git checkout bagin -b baginmerge
git merge bag/master -s subtree #Create the new merge object. baginmerge now points to the merge object. bagin, which hasn't moved, now has two children, one is the merge object, the other is your old history.
git rebase --onto baginmerge bagin master -p #Calculate the diffs from bagin to master, and replay them onto baginmerge. The -p flag tells rebase to preserve merges.
事实上,我已经分叉了您的存储库并完成了上述步骤。在我位于https://github.com/dankessler/NLExtract 的存储库中,您会发现一个名为rebased_master 的新分支。随意把它拉进去。不幸的是,从你的网络图来看,人们已经从你的回购中分叉了,这可能会搞砸他们,但他们应该能够从任何未来的更新中重新定位或挑选,因为内容您的提交应该是相同的,只是它们的 SHA 发生了变化。
如果您查看http://help.github.com/subtree-merge/,子树合并策略大部分相似,因为这应该使您能够根据需要从 BAG-Extract 中提取未来的开发。
我可以想出另一种策略,它看起来好像 bag 的开发最初是作为 your 存储库的子树发生的(但具有正确的作者 ID),但这可能不是你的'正在寻找。这样做的好处是 git blame 和 stuff 之类的实用程序可能会更好地工作,但它要复杂得多,并且需要git filter-branch,我通常听说应该尽可能避免使用它。不过,如果你想走那条路,请告诉我,我会更详细地解释。
祝你好运和欢呼!