目前,对于客户机/服务器解决方案,我有一个预先存在的Git,该解决方案包含3个子项目的三个子目录:
/client - An Angular2 SPA application (client-side TypeScript)
/dtos - Language-agnostic web-service DTO (data contract) definitions written in T4
/client - T4-generated TypeScript typings *.d.ts files
/server - T4-generated C# DTO classes
/server - The web-service到目前为止,所有这些都是在一个master分支中完成的,其中包含适当的临时dev/分支,这些分支在工作完成后被合并:
o--o--o--o - master
\ /
o-o - dev/foo我们需要对Angular2项目中完全不同的UX选项进行一些A/B (或者更确切地说,A/B/C/D)测试--我想对每个UX选项进行分支-关闭,以生成我们可以测试的不同构建,然后在我们的UX研究完成之后,我们将该特定分支合并回master,用于项目的其余部分:
o - master
\
o--o--o---o - ux/red-background
\
o--o----o - ux/new-sidebar
\
o--o - ux/new-sidebar-and-banner但是,我只想关闭/Client目录,因此/DTOs和/Server目录总是包含最新的代码。
在SVN和TFS中,这很容易做到,因为分支可以由子目录创建,而不仅仅是整个存储库(就像使用git时那样),所以如果这是一个SVN项目,那么我会这样做:
cd trunk # this is the solution root with the client, dtos and server directories
svn copy ^/trunk/client ^/branches/red-background
svn copy ^/branches/red-background ^/branches/new-sidebar
# then after some commits to 'new-sidebar'...
svn copy ^/branches/new-sidebar ^/branches/new-sidebar-and-banner然后,为了使用/client的每个不同分支构建解决方案,我们修改了符号链接:
cd trunk
# to 'checkout' the red-background version prior to building:
ln -s branches/red-background client
# or the new-sidebar version:
ln -s branches/new-sidebar client这种方法的主要优点是,可以继续对/dtos和/server目录进行提交,而不会影响client --不管client的哪个分支正在工作。
而使用git,一个分支完全是一个单独的时间线,所以这个场景变得不可能了。
我理解,为了获得我想要的结果,我仍然需要为每个版本创建不同的分支来测试或构建,但是对/dtos或/server的更改仍然需要在master中发生(就像在SVN中的trunk中一样),但是在每次提交之后,处理不同client分支的每个人都需要从master中获得rebase或merge,这可能会变得非常糟糕(特别是如果个人rebase从多个提交到/server选择自己的重基点--它们可能以相同的代码基但不同的提交has结束)。
解决办法是什么?
(另一种解决方案是将client移动到自己的git然后在完成后将其合并回解决方案回购-我不反对这样做,但让我们假设我们已经在组织GitHub帐户中达到了最大的回购计数)
发布于 2017-05-30 22:20:54
理想的方法是将客户端移动到自己的存储库,并使其成为超级项目的子模块。但是,如果您不想创建一个新的存储库,您可以尝试这些解决方案之一。
中的多个目录
如果您能够将项目配置为使用目录/client_A而不是/client,那么您可以将目录/client克隆到多个目录。
并在每个目录中进行单独的开发。到目前为止,只使用主分支就足够了。
稍后,当您决定“合并”目录/client_A到目录/client时,创建一个名为branch_A的分支。在这个分支中,将目录/client的内容替换为/client_A目录的内容,删除目录/client_A并提交此状态。然后合并branch_A以掌握和解决任何冲突。
如果您想要将目录/client_B和/client_C与目录/client“合并”,请对它们进行同样的处理。您可以选择不同的时间“合并”目录/client_A、/client_B和/client_C到目录/client。
选择合适的开始时间,根据你的意愿从师父那里做更多的分支。
从这个开始,请严格使用
使用branch_A、branch_B、branch_C构建不同版本的项目。在构建之前,将主分支合并到这些分支中。避免将这些分支合并到主分支(相反方向)。
稍后,您可以将例如branch_A合并为master。但是在这样做之后,您就不能将主服务器合并到branch_B或branch_C中,这意味着您需要选择合适的结束时间,并在此时将所有分支branch_A、branch_B、branch_C合并为master。
https://softwareengineering.stackexchange.com/questions/349622
复制相似问题