在任何特定时刻,我们都有一个master和develop分支以及任意数量的开放修补程序,功能分支等。
我想知道,如果有一种方法将单个提交合并到所有分支中,那么缺少shell脚本?
我们的测试基础架构允许我们在将它们合并到开发和主控之前测试不同的分支。但偶尔,我们会进行基础架构更改,这需要在所有分支上进行通用代码更改。现在,我们只是进入每个分支,并逐个挑选每个分支的变化。
有一个更好的方法吗?这个问题的一个扩展是,还有一种方法可以强制覆盖每个分支上的整个文件吗?因为即使使用脚本完成,一些分支也可能具有必须解决的冲突,而其他分支将进行不期望的自动合并。但在这种情况下,我们希望整个新更新的文件覆盖每个打开分支顶部的每个副本。
发布于 2019-04-18 09:40:06
最简洁的答案是不。
更长的答案始于你必须以某种方式定义“开放分支”这一事实,因为那不是Git概念。Git中的分支名称只是指向一个特定提交的标签。一个分支通常(取决于谁在说的一句话)一些未指定的系列是提交的可达从这一个具体承诺,但有时它的分支名。
一旦你解决了这个问题,使用git for-each-ref
1来获取所有分支名称的列表,将其过滤到“open”的意思,编写一个shell脚本可能是一个小问题。
shell脚本本身往往相当简单:它运行git checkout
以切换到所需的分支,然后根据需要使用适当的附加参数运行git checkout <hash> -- <path> && git commit
或运行git merge <hash>
。合并案例必须考虑在合并冲突的情况下该怎么做,并要求所选择的<hash>
合并能够产生所需的结果,这是真正的困难部分:适当的<hash>
可能从一个分支名称到下一个分支名称不同,并且在所有情况下,必须在运行脚本之前创建要合并的特定提交。
(当然git checkout <hash> -- <path>
,您也可以使用它代替cp /path/to/external/file <path> && git add <path>
)
ls .git/refs/heads
不处理几种情况,包括名称具有表单的打包引用和分支feature/X
。 请记住,git for-each-ref
需要一个命名空间来遍历:基础之一是refs/heads
,但一个更有趣的一个可能refs/remotes/origin
。有关详细信息,请参阅文档
https://stackoverflow.com/questions/-100006640
复制相似问题