gpt4 book ai didi

git - 将旧的 git 历史 merge 到初始提交中

转载 作者:太空狗 更新时间:2023-10-29 14:39:10 24 4
gpt4 key购买 nike

虽然有几个主题涵盖了类似的问题,但我似乎无法用 Git rebase 可能解决的问题来解决这个问题。

我有一个非常大的 Git 存储库,我想切断提交历史的主要部分。提交图的当前状态是这样的:

(huge tree of various branching and merging) -> commit_I_want_to_squash_to -> branching off into master and couple of feature branches

我想要的结果是:

commit_I_want_to_squash_to_is_first_in_tree -> branching off into master and couple of feature branches

我想这在某种程度上应该是可能的,因为所有当前分支都使用单次提交作为起点。我尝试使用 git rebase --squash,但压缩 300 多个分支历史似乎是一项相当艰巨的任务。应该有一个选项可以在我想首先提交之前“切片”提交树..

最佳答案

所以基本上你想要做的是在某个提交之前切断历史。在 Git 术语中,这意味着您想要将该提交从有父项重写为没有父项(作为新历史记录的开始提交)。

这可以使用 git filter-branch 来完成,像这样:

git filter-branch \
--parent-filter 'test $GIT_COMMIT = <initial-commit-id> && echo "" || cat' \
--tag-name-filter cat -- --all

另一种选择是使用移植功能,如下所示。请注意,您可以在使用 git log 的第一个命令后检查生成的历史记录或图形查看器来验证所需的结果是否正确:

echo "<initial-commit-id> " >> info/grafts  # .git/info/grafts in non-bare repo
git filter-branch --tag-name-filter cat -- --all

请务必在使用 --mirror 克隆的新裸仓库中执行上述命令.这使得推送所有更新的分支和标签变得更加容易。

不包括上述内容的旧标签/分支 initial-commit-id仍将指向旧历史。您必须删除它们才能真正摆脱旧历史。您应该能够使用 git branch --contains <previous-initial-commit-id> 找到它们和 git tag --contains <previous-initial-commit-id> . <previous-initial-commit-id>是之前“初始提交”的 ID,重写的历史不再引用它。

完成上述所有操作后,请参阅 Checklist for Shrinking a Repository如何彻底摆脱旧历史。

关于git - 将旧的 git 历史 merge 到初始提交中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18823843/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com