Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
有没有一种干净的方法来处理两个以相同内容开始的原始git存储库?_Git - Fatal编程技术网

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

有没有一种干净的方法来处理两个以相同内容开始的原始git存储库?,git,Git,假设我有两个由相同初始内容创建的存储库。例如,如果我使用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 我得到了ma

假设我有两个由相同初始内容创建的存储库。例如,如果我使用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显示了一组完全断开连接的提交,正如我所期望的那样

然而,如果我试图合并machine-b的任何更改,那么在所有修改的行上都会出现冲突


就我而言,这已经足够好了,但我想知道,有没有更干净的解决方案?

Git如何区分什么是“配置更改”和什么是“不寻常的事情”?是否只有某些文件要在这两个文件之间共享,例如mime类型的文件


如何将共享部分分解成单独的文件,并使用Apache的Include指令将任何您想要忽略的文件添加到.gitignore?

这是Git的一个有趣用法;我可以用它来处理几个基于相同wiki代码库但配置非常不同的网站

用您的初始内容设置Git repo,并为保存其当前配置的每台计算机创建单独的分支。克隆到另一台计算机,并将每台计算机设置为另一台计算机的远程计算机

现在,您可以在一台机器上进行更改,并在提交更改时将其推送到另一台机器上的分支上

如果将公共元素与非公共元素分开提交,则可以

$ git checkout [localmachine bracnch]
$ git cherry-pick [SHA1 of common commit1]
$ git cherry-pick [SHA1 of common commit2]
而且,如果在一台机器上提交之前不知道要重用什么,可以使用
git add--patch
从一个分支中提取各个差异,并将它们提交到另一个分支


对于两台以上的计算机/站点,您可以将常见更改合并到
MASTER
上,并将对
MASTER
的更改合并到每个分支上。

您可能想看看git grafts。此处提供了一些信息:

基本上,你想做的是伪造一个祖先

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

你可以通过使用移植物来实现这一点。例如,将其放在.git/info/grafts文件中:

secondB baseA
(但使用真正的SHA)。现在,如果您查看GitX,您将看到历史记录是相互连接的。要使更改永久化,需要运行git过滤器分支

根据评论更新 我不确定你所做的是“正确的”,尽管它会起作用。如果你做什么 如果您做到了,您将成为历史:

 BaseA --- SecondA -- .. - ..  - Merge
   \ BaseB --- SecondB ... - .. /
这将起作用(合并将顺利进行)。然而,这是什么 更好的是:

 BaseA --- SecondA -- .. - ..  - Merge
   \ SecondB ... - .. /
它基本上将“BaseA”作为commit,并将“BaseA”设置为 第二,B。这应该是可能的使用嫁接规则,我告诉你

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

如果你看一下GitX中的历史(“GitX大师二级大师”),你会 请确保历史记录已断开连接。如果将.git/info/_grafts文件移动到.git/info/grafts,您将获得第二个漂亮的历史记录

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

如果您查看grafts文件中的SHA,您将看到_grafts文件基本上有以下内容:

SecondB BaseA
BaseB BaseA
错误的_grafts文件包含以下内容:

SecondB BaseA
BaseB BaseA

Apache只是我想使用类似这样的东西的案例之一。可以将其视为使用git作为补丁分发机制。我经常对同一个库存配置文件上的几个服务器进行相同的配置更改。我认为这非常接近,但目前对我不起作用。GitX在我编辑后不显示更新。git/info/grafts和git filter branch给了我“错误:错误的移植数据:”我现在正在尝试在移植中的各种提交组合。好的,我已经成功了。如果你能更新我会接受答案。git/info/grafts是baseB baseA,然后我运行了:git filter branch baseB..HEAD也使用了正确的grafts文件gitx在运行filter branch之前正确地显示了历史记录。我更新了我的答案,并回复了你的评论,因为它太大了,无法放在评论部分。你的答案对我有效,现在出于某种原因,我的测试报告有效。我不确定我在grafts文件中搞砸了什么,但从我读到的内容来看,它可能像空白一样简单。谢谢在任何情况下,我想如果新的repo没有任何新的提交,我可能必须按照我的方式来做。如果我有先见之明克隆配置repo,那就行了。在这种情况下,我通常在编辑一些配置文件之前先执行git init,然后才意识到我想将在另一台机器上执行的一些操作修补到这台机器的配置中。不过,我们将调查每台机器的分支想法。是的,外卖想法是每台机器的分支。您可以使用grafts或创建一个新的repo,该repo从每台机器上通用的文件内容开始,并将每台机器的历史作为一个单独的分支重新设置为基础。彼特对移植物做了很好的解释。