我遇到这种情况:
存储库A 包含某种框架(例如带有基本设置和一些常用控制器的CakePHP)。
存储库B 包含项目,基于存储库A ,包含其他文件,以及来自框架的文件中的一些更改/添加。
不幸的是,结构无法更改,因此A是B项目中的一个单独的子文件夹(在controllers文件夹中是框架中的公共控制器,加上其他的)。
我想实现以下目标:
推送对框架(A)进行一些更改后,我希望将更改应用于不同的存储库(B)。 A和B在服务器上设置为共享裸存储库。
据我了解,post-receive
(或post-commit
?)钩子可以处理,但我不知道它是如何完成的。我认为钩子应该从最后一次更改创建一个补丁文件,并以某种方式将其应用于其他几个存储库。
有人有这方面的例子吗?
(另一种方法是,基于该框架为所有项目使用一个存储库,每个项目都是一个分支,但这看起来不是很干净,我不喜欢将所有项目都放在一个大丛)。
答案 0 :(得分:0)
如果您要从--bare
repo A
(在某些服务器上)向B
(以及C
,D
,{{1}发送补丁}}},主要问题是搞清楚这一点:“哪些版本的E
做A
,B
,C
,...有哪些他们应该有什么?“
例如,假设有人在D
工作:
A
把他在当地git push origin master:experiment_for_joe devel:featureX
分支上的东西拿走给乔(在他自己的回购中以某种方式移动它之前)并拿走他在master
分支上的东西在服务器上将其命名为devel
。
是否有一些版本的experiment_for_joe和/或featureX转到featureX
?或者可能只到B
?
让我们说答案就是“不,永远,只有进入D
的任何事情都会消失”。很容易,但现在问题的另一半:如果deploy
在有人向B
添加三次提交之前有最新最好的情况怎么办,但由于某种原因,deploy
落后了7次提交?如果C
上的版本与repo D
中的任何版本不匹配怎么办?
假设你可以解决所有这些问题,并得到类似的结论:
A
(依此类推),然后 - 假设devel on A is now the latest
B has $on_B which is definitely in A
C has $on_C which is definitely in A
,B
等都是repos,你想要显示所有中间提交(如果没有,你可以获得一个大补丁代替):
C
为您提供使git format-patch $on_B..devel
同步所需的一系列补丁,并且:
B
为您提供使git format-patch $on_C..devel
同步所需的一系列补丁,依此类推。 (如果目标回购“真的不匹配”,这些可能需要按摩才能正确应用。)
(如果他们没有回购,请使用C
或git diff $on_B devel
和/或一些基础管道位,以直接映射“如何更改git diff-tree
上的内容” B
中的内容。但是,如果此处出现任何问题,两者可能会失去同步而且很难恢复。如果devel
,B
等,是回购,你有更多机会弄清楚你需要做些什么来恢复。)