gpt4 book ai didi

git - 有没有一种干净的方法来处理两个以相同内容开头的原始 git 存储库?

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

假设我有两个基于相同初始内容创建的存储库。例如,如果我使用 git 来管理/etc/apache2 中的 apache 配置文件,并且我分别在 machine-a 和 machine-b 上运行 git init

从那以后,我对 machine-b 进行了一些配置更改,我想将这些更改应用于 machine-a 上的配置,而不会覆盖主机名等不常见的内容。

如果我这样做:

machine-a% remote add machine-b ssh://...
machine-a% git fetch machine-b

我得到了 machine-b 上的所有提交,GitX 显示了一组完全断开的提交,正如我所期望的那样。

但是,如果我尝试 merge machine-b 的任何更改,我会在所有修改的行上发生冲突。

就我的目的而言,这已经足够了,但我想知道是否有更清洁的解决方案?

最佳答案

你可能想看看 git grafts。此处提供了一些信息:http://git-scm.com/docs/git-filter-branch

基本上,您要做的是伪造祖先。

您在两台机器上都进行了初始提交——我们称它们为“baseA”和“baseB”。然后,您在两侧创建了第二个提交——“secondA”和“secondB”。你想要做的是告诉 git 'secondB' 没有 'baseB' 作为祖先,而是有 'baseA' 作为父级。

你可以通过移植来做到这一点。例如,将其放入您的 .git/info/grafts 文件中:

secondB baseA

(但随后使用真正的 SHA)。现在,如果您查看 GitX,您会发现历史是相互关联的。要使更改永久生效,您需要运行 git filter-branch。

评论更新

我不确定您所做的是否“正确”,尽管它会起作用。如果你做什么你做到了,你会得到历史:

 BaseA --- SecondA -- .. - ..  - Merge
\ BaseB --- SecondB ... - .. /

哪个会起作用(并且 merge 会毫无问题地成功)。然而,什么是更好一点的是:

 BaseA --- SecondA -- .. - ..  - Merge
\ SecondB ... - .. /

基本上将“BaseA”作为提交并将“BaseA”设置为父级第二 B.这应该可以使用我告诉过你的嫁接规则。

为了演示这一点,我创建了一个小型存储库,您可以下载 here .

如果你查看 GitX 中的历史记录(“gitx master second_master”),你会看到历史是断开的。如果将 .git/info/_grafts 文件移动到 .git/info/grafts,您将获得第二个漂亮的历史记录。

我还添加了一个 .git/info/wrong_grafts 文件。如果您使用那个,您将获得您创建的历史记录。

如果查看 grafts 文件中的 SHA,您会发现 _grafts 文件基本上包含以下内容:

SecondB BaseA

wrong_grafts 文件有这个:

BaseB BaseA

关于git - 有没有一种干净的方法来处理两个以相同内容开头的原始 git 存储库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/394647/

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