我们最近从SVN切换到GIT进行回购管理,并且非常了解非线性源控制风格。目前,整个代码库(服务混合,Windows / Xamarin客户端和ASP.net网站)被转储到回购中,包括各种核心库。
为了进一步改进我们的工作流程,我试图将我们所有的项目分离到他们自己的存储库中(例如:一个用于Web服务,一个用于Windows程序等),达到大约6个左右的单独共享一些代码的项目。
现在,我已经对一些不同的解决方案进行了一些研究,但我很难找到妥协方案。最后,我们希望锁定我们核心库的master
分支,因为它们是关键任务,需要通过拉取请求进行同行评审。只有这样他们才会被接受。
我的第一个想法是使用GIT子模块,但经过一些研究后,我发现对子树的新概念给予了青睐。
我在一些停机时间玩过子树,并且看不到任何方法为父项目的不同分支选择远程子树的不同分支(例如核心库)。
我也给了NuGet包,但是可以提交和批准的可编辑源的要求在这里没有实现。
我还没有认真看过这里的子模块,所以这里可能需要它们固有的复杂性?或者我错过了什么?
答案 0 :(得分:0)
我无法确切地说出你的问题是什么,但关于:
...无法看到任何方法为父项目的不同分支选择远程子树的不同分支(例如核心库)。
您是否建议您将父项目的分支链接到子树上的分支?如果所有的子项目都倾向于与超级项目同步提交,我认为像 git slave 这样的东西更适合。
如果您倾向于主要处理超级项目,并且偶尔会对子项目进行更改(可以决定何时推回子项目跟踪存储库),则子树更为理想。
想想它有点像中间件。
您从供应商处获得了一个删除,并确保您的代码适用于所做的任何api更改。从那时起,它只是你的超级项目存储库的一部分。快乐地做出改变。如果你做了一些很棒的事情,并希望将其贡献给子项目,将其拆分为一个分支,然后将其合并到子项目的一个分支中,并从那里发出拉取请求。
在您开发期间,您还可以定期从“供应商”下拉更改以更新您的子项目。
所以,我不确定这是你想象的工作流程,但你确实可以通过分支将子树更改推送到子项目。
我将引用https://github.com/git/git/blob/master/contrib/subtree/git-subtree.txt作为分割语法和示例。 请参阅:“示例3.使用分支提取子树”
以下是我想象您的工作流程的方法:
多个超级项目使用子树将子项目拉入文件夹。当子项目发生变化时,它们不会自动神奇地进行更改,这很好,因为你想控制何时拉动,这样你就可以确保一切都能正常工作。
标准工作流程是克隆master,在分支上工作,并将更改提交回超级项目(实际上可能包括对子项目的更改,但超级项目仍然可以通过合并请求进行门控正常的工作流程。)
或许对子项目所做的一些改变并不完整,或者它们只适合超级项目的当前状态,但尚未准备好广泛分发给其他超级项目。 在这种情况下,您可以直接将更改拆分,直到准备好(至少您在超级项目中跟踪它), OR 您可以将更改拆分为分支。创建主子项目的分支并推送到该子项目。如果您对此子项目有紧密的合并要求,那就是您提出拉取请求的方式,但不要将其与现在必须从子项目的该分支拉到您的工作超级项目。您想要这样做的唯一原因是,如果您有2个超级项目想要在正式将其提交给主人之前共享子项目工作。
答案 1 :(得分:0)
如果您需要在超级项目上启用子项目:
您可以使用触发器脚本禁止用户提交具有子项目更改的任何内容,并强制他们在需要时首先进行分支。然后处理对超级项目主数据库的拉取请求,并自动将子项目更改拆分到子项目跟踪存储库。
我认为用户需要同时对超级项目和子项目进行更改,以便跟上界面的变化。
另一方面,当您从子项目中拉出时,您必须同时更新超级项目,因此应该涵盖这两种情况。
注意,您要么必须从特权用户(处理合并请求的用户)执行子树拉取,要么用户必须执行建议的拉动到分支并提交拉取请求,因为它会包含将触发签入脚本的子项目更改。