“混帐 – 他们的”需要 – 但我知道它不存在

我有一些我想要合并在一起的远程存储库。 这些存储库中的一些子树对于远程来说是唯一的(它们包含特定于主机的数据),其他子树包含所有远程数据(应该是)通用的。

我想要做的,基本上是为每个遥控器运行“git pull”。 这将快速转发远程主服务器的跟踪分支上的本地主分支,以便在远程主机上进行更改,并且不会对通用文件执行任何操作,因为它们不会更改。

一个普通文件的改变(称为F,改变为F')不应该是一个问题,即使它最初只发生在一个遥控器上。 git-merge会做正确的事情,并给我一个F'在我的复合工作区,这正是我想要的副本。 如果同一个公共文件在另一个远程中以不同的方式改变(称为F“),git-merge会给我一个F和F的组合,这不是我想要的。 我想要的只是F“。

当我使用ClearCase时,我们称之为复制合并。 合并的结果始终是撰稿人的确切副本。 这听起来很像“混帐他们”,除了它不存在。

我想知道我是否可以用“git-read-tree -m -trivial”来做一些快速的合并,然后用git-merge和一个自定义的mergetool做一些魔法, REMOTE文件为$ MERGED。 但即使如此,我不明白如果我合并是微不足道的,我怎么能阻止混合合并F'和F“。

我读过链接有没有“他们的”版本的“混帐 – 我们的”? 在这个网站上,由Junio Hamano发表的文章解释了为什么“git合并他们的”是一个糟糕的主意,但对我来说并不是这样。 我重视旧的历史,但是我需要跳船,并在发生的时候跟踪远程站点的变化。 本地网站没有新的工作。 它只需要组成所有远程站点的组合,从最后一个被轮询的远程站点中取出最新的“通用”文件。

预先感谢您能给我的任何帮助。

非常感谢@VonCbuild议在.gitattributes文件中使用merge = custom-driver属性。 虽然这会起作用,但我不愿意用.git文件污染我的工作空间,虽然我可以使用$ GIT_DIR / info / attributes来避免污染,但由于需要2条规则来捕获点文件和非点文件。

经过一些实验后,我设法得到了merge.defaultconfigurationvariables(在gitattributes(5)手册页中提到)的解决scheme。 我错过的诀窍是merge.default采用之前定义的自定义驱动程序的名称 ; 你不直接给它定制命令 。 这是我的作品…

首先定义您的复制合并自定义驱动程序。 您可以直接使用shell命令; 不需要外部脚本(只要确保你的shell元字符引用正确):

 git config merge.copy-merge.name 'Copy Merge' git config merge.copy-merge.driver 'mv %B %A' 

请注意,mv成功返回0,失败时返回1,满足报告合并“成功”回到git的标准。

现在告诉git all merges是复制合并:

 git config merge.default copy-merge 

嘿Presto! 任务完成。 git merge <branch>现在将复制所有东西,使得你所在的分支包含<branch>上的所有文件的确切副本。 QED。

如果你想做一个非复制合并,然后简单地重置默认的合并驱动程序:

 git config --unset merge.default 

如果你想要更有select性,那么留下merge.default未设置,并使用属性作为@VonC说:

 cd path/to/copy-merge/in echo '* merge=copy-merge' > .gitattributes echo '.* merge=copy-merge' >> .gitattributes 

在要复制的每个子树的顶部执行此操作。如果存在不想复制的子树,可以再次将其closures:

 cd path/to/copy-merge/in/path/to/normal-merge/in echo '* merge' > .gitattributes echo '.* merge' >> .gitattributes 

警告:乱抛垃圾的工作树有很多.gitattributes文件势必会导致混淆,尤其是如果你还在其他目录中使用诸如“* .bin -merge”之类的东西来强制.bin文件的所有合并失败并发生冲突。 使用$ GIT_DIR / info / attributes可能更好,因为它具有最高的优先级。

前几天遇到这个问题:

http://seanius.net/blog/2011/02/git-merge-s-theirs/

 git merge -s ours ref-to-be-merged git diff --binary ref-to-be-merged | git apply -R --index git commit -F .git/COMMIT_EDITMSG --amend 

在Git 1.7.1版中,你可以通过一个“他们的”策略来合并和“-X他们”的论点。

git merge -Xtheirs otherBranch

不知道这是否适用于你想要做的,但它可能是值得一试。

(也参见这个相关的问题 )

(2011年更新:
git命令让一个分支像另一个分支 ”列出了所有可能的方法来模拟一个git合并 – 他们的


对于你想复制的特定文件/树,你可以设置一个gitattributes值,就像我在这个SO问题中提到的那样,定义一个自定义的合并驱动程序。
与合并属性相关联的脚本将确保始终将远程文件保留为合并结果(请参阅此SO答案的插图,尽pipe是相反的情况 – 保留本地版本)。

 echo * merge=keepTheir > dirWithCopyMerge\.gitattributes git config merge.keepTheir.name "always keep theirduring merge" git config merge.keepTheir.driver "keepTheir.sh %O %A %B" 

通过在要复制合并的子树顶部设置一个.gitattribute,以' * merge=keepTheir '作为内容,可以将一个自定义合并驱动程序有效地归属到该子树的所有文件(注意使用' * '通配符在这里)。

用keepTheir.sh作为:

 mv -f $3 $2 exit 0 

您不必修改任何“默认”合并驱动程序,并且只将自己的文件应用于所需的文件。

经过大量的研究,经历了所有的噪音,并再次了解git它是否结束? ),我相信这个答案是实现自定义--strategy theirs的最无噪音和最优化的方法 – --strategy theirs模拟合并驱动程序。 根据需要可用,不需要任何gitattributes垃圾。

实际上,对于这是一个--strategy theirs模拟还是最stream畅的可用checkout --theirs . ,我还是有点头晕checkout --theirs . 冲突解决方法。 也许他们是等价的,但我不得不诊断一些结果图来充分理解,现在是没有时间的。

道具@kbro做正确的事情追逐细节,并得到相当接近https://stackoverflow.com/a/1911370/35946

[git:master]是shell提示符显示。

build立

 $ [git:master] git config merge.theirs.name 'simulate `-s theirs`' $ [git:master] git config merge.theirs.driver 'cat %B > %A' # same as `mv` or `cp`, matter of taste 

使用

 $ [git:master] GIT_CONFIG_PARAMETERS="'merge.default=theirs'" git merge develop 

奖金:别名

 $ [git:master] git config alias.merge-theirs \!GIT_CONFIG_PARAMETERS=\""'"merge.default=theirs"'"\"\ git\ merge 

使用:ALIAS

 $ [git:master] git merge-theirs develop 

请注意GIT_CONFIG_PARAMETERS的引用结构,因为它必须能够获取多个复杂的值。 获得该奖金命令行花费努力弄清楚。

PS GIT_CONFIG_PARAMETERS必须是最好保守的秘密,我们几乎完成了2016年, https: GIT_CONFIG_PARAMETERS有1(一)结果( 1 )