【问题标题】:git insert historic changes of subdirectorygit插入子目录的历史变化
【发布时间】:2012-02-29 19:34:05
【问题描述】:

我知道这听起来像是一个奇怪的问题..

我在 github 上有一个 repo https://github.com/milovanderlinden/NLExtract

它有一个子目录“bag”来自:https://github.com/MinIenM/BAG-Extract

在创建 NLExtract 的过程中,我们不小心忽略了在保留历史记录的同时正确合并 BAG-Extract。

为了保持对原作者的信任,我想从 BAG-Extract 获取完整的提交历史记录到 NLExtract/bag 中。

这可能吗?关于如何进行这种“历史注入”的任何提示?

【问题讨论】:

    标签: git merge github


    【解决方案1】:

    我想我可以帮助你解决这个问题,因为我以前需要做类似的事情。

    缺点是我的解决方案需要重写一些历史记录。如果你有很多合作者,这将是痛苦的,因为每个人的历史都会改变。我所知道的实际上没有任何解决方法,因为即使像在当前根之前添加父提交这样简单的操作也会更改提交消息或我们的旧根,这会更改其 SHA,这会影响其子项的父字段,这会更改其 SHA,依此类推。

    通过查看您在 github 上的存储库,您似乎只有几个贡献者,所以这并不是那么麻烦。

    我还假设https://github.com/MinIenM/BAG-Extract 的包存储库在您阅读后没有进展,从阅读您的提交日期和 BAG-Extract 提交的日期来看,我认为是这种情况。

    由于听起来您的目标只是表扬,因此子树合并可能适合您。

    我们基本上会做以下事情:

    1. 读入 BAG-Extract 作为新分支。它不会有共同的历史。
    2. 确定您在历史记录中的哪个位置引入了 bag 子目录。我们称之为“bagin”
    3. 添加一个新的合并提交,它将最后一个 BAG-Extract 提交和来自 (2) 的提交作为父项。这将是一个子树合并,所以想法是两个父级的不同之处仅在于一个以子树为前缀(例如 bag/)
    4. 将所有帖子“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,我通常听说应该尽可能避免使用它。不过,如果你想走那条路,请告诉我,我会更详细地解释。

    祝你好运和欢呼!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-10-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-25
      • 1970-01-01
      • 2023-01-30
      相关资源
      最近更新 更多