gpt4 book ai didi

git - 如何将多个 Git 存储库 merge 为一个并交错历史记录

转载 作者:太空狗 更新时间:2023-10-29 13:21:28 25 4
gpt4 key购买 nike

我的情况是我有两个 Git 存储库,我需要将它们 merge 到一个存储库中(实际上还有更多存储库,但我可以从两个开始)。

这两个存储库是:

  • 主存储库,A
  • 第二个存储库,B

存储库 B 中的代码依赖于存储库 A 中的代码(但不是反之亦然),以及两个存储库的历史按时间顺序相互遵循 - 大致(即 repo B 中的特定提交通常需要来自 repo A 的提交,并且提交时间非常相似)。

两个存储库中有冲突的分支和标签名称(不能保证它们属于一起),但只需要保留来自 A 的引用。

新存储库 C 的要求是:

  1. A 中的所有引用(分支和标签)都需要保留。
  2. 只有 B 的主分支提交需要保留(即 git log --first-parent master 报告的提交)。
  3. 来自每个源仓库的文件应该放入新仓库的子文件夹中(即来自 A 的文件应该放入 A/ ,而来自 B 的文件应进入 B/ )。
  4. 当检查存储库C(例如发布标签)中的特定提交(包括 merge 之前完成的提交)时,应该在两个源存储库中找到兼容的文件目录 A/B/ (至少在一两次提交中)。

到目前为止,我已经尝试了几种方法,包括 thisgit-stitch-repo , 没有成功(他们没有满足上述要求)。

此时,我已经设法:

  • 使用 git filter-branch 将每个 repo 中的所有文件移动到一个子目录。例如。对于 repo A:
mkdir Amv * .gitignore A/ 2> /dev/nullgit commit -a -m 'DROPME' > /dev/nullgit filter-branch --tag-name-filter cat --index-filter 'git ls-files -s | sed "s-\t\"*-&A/-" | GIT_INDEX_FILE=$GIT_INDEX_FILE.new git update-index --index-info && mv "$GIT_INDEX_FILE.new" "$GIT_INDEX_FILE" ||:' -- --allgit reset --hard origin/mastergit for-each-ref --format="%(refname)" refs/original/ | xargs -n 1 git update-ref -d
  • 使用 git fast-export 将 repo B 导入 A/fast-import .
  • 设备一种生成映射的方法,这样对于 A 中的给定 SHA,有一个列表,其中包含零个、一个或多个应该从 B .

我现在期望的是 git filter-branch 的一些巧妙用法应该使我能够将选定的提交从 B 插入到 A 的主分支中。但是如何呢?

最佳答案

事实证明,解决方案比我希望的要复杂得多。它涉及操作和组合两个(或更多)git fast-export 流的输出,并使用 git fast-import 将它们导入到新的存储库中。

简而言之,一个新的fast-import 流是通过遍历两个输入流,并根据来自主要分支的按日期排序的日志在它们之间来回切换而生成的。

我已经在名为 join-git-repos.py 的 Python 脚本中实现了该解决方案,并将其放入 GitHub 存储库 here .

关于git - 如何将多个 Git 存储库 merge 为一个并交错历史记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40976798/

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