1

我有这种情况:

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

Repository B包含一个基于 Repository A 的项目,带有附加文件,以及来自框架的文件中的一些更改/添加。

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

我想实现以下目标:

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

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

有人有这个例子吗?

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

4

1 回答 1

0

如果你想从--barerepo A(在某个服务器上)发送一个补丁到B(and C, D, E...),主要的问题是弄清楚这个:“ Ado B, C, D, ... 有哪些版本,他们应该使用哪些版本有?”

例如,假设有人在A做:

git push origin master:experiment_for_joe devel:featureX

把他在本地master分支上的东西拿给乔(也许在以某种方式在他自己的仓库中移动它之前),然后把他在他的devel分支上的东西拿走并featureX在服务器上命名。

Experiment_for_joe 和/或 featureX 的某些版本是否适用B?或者也许只是为了D

假设答案是“不,永远不会,只有进去的东西才会deploy出来”。很简单,但现在问题的另一半:如果在B有人向. 如果版本与 repo中的任何版本都不匹配怎么办?deployCDA

假设您可以解决所有这些问题,并着手解决以下问题:

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,C等都是 repos 并且你希望所有中间提交都显示出来(如果没有,你可以得到一个大补丁):

git format-patch $on_B..devel

B为您提供同步所需的一系列补丁,并且:

git format-patch $on_C..devel

为您提供同步所需的一系列补丁C,等等。(如果目标回购“不真正匹配”,这些可能需要按摩才能正确应用。)

(如果它们不是 repos,请使用git diff $on_B develgit diff-tree和/或一些底层管道位,以获得“如何将正在发生的内容更改为正在发生的内容”的直接映射Bdevel但是,如果这里出现任何问题,两者都可以退出同步并且很难恢复。如果B,Crepos,你有更多的机会弄清楚你需要做什么来恢复。)

于 2013-09-25T20:52:30.773 回答