如何使用GIT post hook将更改应用于其他存储库

时间:2013-09-25 13:34:23

标签: git hook repository

我遇到这种情况:

存储库A 包含某种框架(例如带有基本设置和一些常用控制器的CakePHP)。

存储库B 包含项目,基于存储库A ,包含其他文件,以及来自框架的文件中的一些更改/添加。

不幸的是,结构无法更改,因此A是B项目中的一个单独的子文件夹(在controllers文件夹中是框架中的公共控制器,加上其他的)。

我想实现以下目标:

推送对框架(A)进行一些更改后,我希望将更改应用于不同的存储库(B)。 A和B在服务器上设置为共享裸存储库。

据我了解,post-receive(或post-commit?)钩子可以处理,但我不知道它是如何完成的。我认为钩子应该从最后一次更改创建一个补丁文件,并以某种方式将其应用于其他几个存储库。

有人有这方面的例子吗?

(另一种方法是,基于该框架为所有项目使用一个存储库,每个项目都是一个分支,但这看起来不是很干净,我不喜欢将所有项目都放在一个大丛)。

1 个答案:

答案 0 :(得分:0)

如果您要从--bare repo A(在某些服务器上)向B(以及CD,{{1}发送补丁}}},主要问题是搞清楚这一点:“哪些版本的EABC,...有哪些他们应该有什么?“

例如,假设有人在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 同步所需的一系列补丁,依此类推。 (如果目标回购“真的不匹配”,这些可能需要按摩才能正确应用。)

(如果他们没有回购,请使用Cgit diff $on_B devel和/或一些基础管道位,以直接映射“如何更改git diff-tree上的内容” B中的内容。但是,如果此处出现任何问题,两者可能会失去同步而且很难恢复。如果develB等,回购,你有更多机会弄清楚你需要做些什么来恢复。)