我有许多远程存储库,我想合并在一起.这些存储库中的一些子树对于远程控制器是唯一的(它们包含特定于主机的数据),其他子树包含在所有远程控制器中通用的数据(应该是).
基本上,我想做的是为每个遥控器运行"git pull".这将使远程主服务器的跟踪分支上的本地主分支快速转发到远程主服务器上已更改的特定于主机的文件,并且对公共文件不执行任何操作,因为它们不会更改.
公共文件中的更改(称为F,更改为F')应该不是问题,即使它最初只发生在一个远程上.git-merge将做正确的事情并在我的复合工作区中给我一个F'的副本,这就是我想要的.如果同一个公共文件在另一个遥控器上以不同的方式改变(称之为F"),问题就出现了.git-merge将给我一个F'和F"的组合,这不是我想要的.我想要的只是F".
当我使用ClearCase时,我们将其称为复制合并.合并的结果始终是贡献者的精确副本.这听起来很像"git merge -s theirs",但它不存在.
我想知道我是否可以通过"git-read-tree -m -trivial"来做一些事情来快速合并,然后用git-merge和一个自定义合并工具来简单地复制$ REMOTE文件到$ MERGED.但即便如此,我也看不出如何从合成F'和F中停止git-merge,如果合并是微不足道的话.
我已阅读链接是否有"他们的"版本的"git merge -s ours"?在这个网站上,Junio Hamano的帖子引用了解释为什么"git merge -s theirs"是一个坏主意,但对我来说情况并非如此.我确实重视旧的历史,但我需要跳出船并在发生事件时跟踪远程站点上的更改.本地站点上没有新工作.它只需要形成所有远程站点的组合,在更改时从最后一个轮询的远程站点获取最新的"公共"文件.
在此先感谢您提供给我的任何帮助.
非常感谢@VonC建议在.gitattributes文件中使用merge = custom-driver属性.虽然这会起作用,但我不愿意用.git文件污染我的工作区,虽然我可以使用$ GIT_DIR/info/attributes来避免污染,但是我需要2条规则来捕获点文件和非点文件.
经过一些实验,我设法得到一个解决方案,其中包含merge.default配置变量(在gitattributes(5)联机帮助页中提到).我错过的技巧是merge.default采用您之前定义的自定义驱动程序的名称 ; 你不直接给它自定义命令.这对我有用......
首先定义复制合并自定义驱动程序.您可以直接使用shell命令; 不需要外部脚本(只需确保你的shell元字符引用正确):
git config merge.copy-merge.name 'Copy Merge'
git config merge.copy-merge.driver 'mv %B %A'
Run Code Online (Sandbox Code Playgroud)
请注意,mv在成功时返回0,在失败时返回1,满足将合并"success"报告回git的条件.
现在告诉git所有合并都是复制合并:
git config merge.default copy-merge
Run Code Online (Sandbox Code Playgroud)
嘿Presto!任务完成. git merge <branch>现在将复制合并所有内容,因此您所在的分支包含<branch>上所有文件的精确副本.QED.
如果要进行非复制合并,则只需重置默认合并驱动程序:
git config --unset merge.default
Run Code Online (Sandbox Code Playgroud)
如果你想要更有选择性,那么请保留merge.default unset并使用属性@VonC说:
cd path/to/copy-merge/in
echo '* merge=copy-merge' > .gitattributes
echo '.* merge=copy-merge' >> .gitattributes
Run Code Online (Sandbox Code Playgroud)
在要复制合并的每个子树的顶部执行此操作.如果存在您不想复制合并的子树,则可以再次将其关闭:
cd path/to/copy-merge/in/path/to/normal-merge/in
echo '* merge' > .gitattributes
echo '.* merge' >> .gitattributes
Run Code Online (Sandbox Code Playgroud)
警告:使用大量.gitattributes文件乱丢你的工作树一定会导致混淆,特别是如果你在其他目录中也使用"*.bin -merge"之类的东西强制.bin文件的所有合并都会因冲突而失败.为这类事情使用$ GIT_DIR/info /属性可能更好,因为它具有最高优先级.
(2011 年更新:
答案“ git command for Making onebranch like another ”列出了模拟 git merge -s Theirs` 的所有可能方法)
对于您想要复制合并的特定文件/树,您可以设置一个gitattributes 值,就像我在这个SO 问题中提到的那样,定义一个自定义合并驱动程序。
与合并属性关联的脚本将确保始终将远程文件保留为合并结果(请参阅此SO 答案以获取说明,尽管是相反的情况 - 保留本地版本)。
echo * merge=keepTheir > dirWithCopyMerge\.gitattributes
git config merge.keepTheir.name "always keep theirduring merge"
git config merge.keepTheir.driver "keepTheir.sh %O %A %B"
Run Code Online (Sandbox Code Playgroud)
通过在要复制合并的子树顶部设置 .gitattribute,并以“ ”作为其内容,您可以有效地将自定义合并驱动程序归因于该子树的所有文件(请注意此处* merge=keepTheir使用“ ”通配符*)。
将 keepTheir.sh 设为:
mv -f $3 $2
exit 0
Run Code Online (Sandbox Code Playgroud)
您不必修改任何“默认”合并驱动程序,并且您只需将自己的驱动程序应用于所需的文件即可。
| 归档时间: |
|
| 查看次数: |
9580 次 |
| 最近记录: |