gpt4 book ai didi

git - merge 不相关的 git 存储库,保留历史/分支

转载 作者:IT王子 更新时间:2023-10-29 00:56:27 25 4
gpt4 key购买 nike

我们有 3 个独立的 git 存储库(每个都有一些分支),我们想将它们 merge 为一个保留完整历史记录和访问分支的能力,如下所示:

这就是我们所拥有的。 3 个 repo :

/A/.git
/B/.git
/C/.git

我们想要一个包含 3 个子目录的 super 仓库:

super/.git
super/A
super/B
super/C

并说当切换到分支 feature1(最初在 repo B 中,在 repo C 尚不存在时引入)我们期望结果是:

super/.git
super/A
super/B

我们读过 Combining multiple git repositories但是在使用 git-stitch-repo 时遇到了麻烦,它基本上像宣传的那样工作,只是在 super-repo 中缺少相当多的提交(没有任何指向问题的错误消息)。

知道我们这里可能做错了什么吗?

编辑我们知道子模块和子树 merge ,但两者都不是一个选项。这应该是一次性操作。我们需要一劳永逸地加入 repo 协议(protocol)。

编辑可能是提出基本相同问题的一种更简单的方法:假设我们有一个包含 3 个完全不相关的分支的 repo 协议(protocol)。我们可以将它们 merge 到一个分支而不会发生冲突(因为它们不共享文件)。现在,当查看历史记录时,我们看到 3 个不相关的提交分支和一个它们聚集在一起的点。但我们希望看到的是由所有 3 个分支的交错(按日期/时间)提交组成的一个分支。

最佳答案

你不需要子模块,因为你会用你将要发出的所有 git submodule update 命令来 pull 扯你的头发。您还必须发出 3 个 git log 命令而不是一个命令来查看在特定时间内发生了什么。

将所有历史记录 merge 到一个存储库中。使用filter-branch重置每个repos history所在的目录,不需要拼接。执行过滤器分支后,您可以在任何时候简单地 merge 。

基本上,repoA/master、repoB/master 和 repoC/master 将存在于您创建的新存储库中(尽管您可以只从其中一个开始)。应用过滤器分支后,每次提交中的每棵树都会有一个新的根节点,该节点将是一个目录(A 代表 repoA 分支,B 代表 repoB 分支,等等)。

git checkout -b newbranch --root
git log --all --format=%ad%H | sort | cut -c10- | xargs -n 1 git cherry-pick

调整切割,使其只采用散列。没试过这个,但让我知道它是如何工作的。您可能需要首先使用 rebase 来平整历史记录。您不能从 3 个不同的历史中交错不同的分支和 merge 。

希望这对您有所帮助。

关于git - merge 不相关的 git 存储库,保留历史/分支,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7575367/

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