首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在保持从其他目录提交的同时分支子目录

在保持从其他目录提交的同时分支子目录
EN

Software Engineering用户
提问于 2017-05-25 23:43:02
回答 1查看 2.1K关注 0票数 5

目前,对于客户机/服务器解决方案,我有一个预先存在的Git,该解决方案包含3个子项目的三个子目录:

代码语言:javascript
复制
/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/分支,这些分支在工作完成后被合并:

代码语言:javascript
复制
o--o--o--o - master
 \   /
  o-o      - dev/foo

我们需要对Angular2项目中完全不同的UX选项进行一些A/B (或者更确切地说,A/B/C/D)测试--我想对每个UX选项进行分支-关闭,以生成我们可以测试的不同构建,然后在我们的UX研究完成之后,我们将该特定分支合并回master,用于项目的其余部分:

代码语言:javascript
复制
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项目,那么我会这样做:

代码语言:javascript
复制
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的每个不同分支构建解决方案,我们修改了符号链接:

代码语言:javascript
复制
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中获得rebasemerge,这可能会变得非常糟糕(特别是如果个人rebase从多个提交到/server选择自己的重基点--它们可能以相同的代码基但不同的提交has结束)。

解决办法是什么?

(另一种解决方案是将client移动到自己的git然后在完成后将其合并回解决方案回购-我不反对这样做,但让我们假设我们已经在组织GitHub帐户中达到了最大的回购计数)

EN

回答 1

Software Engineering用户

发布于 2017-05-30 22:20:54

理想的方法是将客户端移动到自己的存储库,并使其成为超级项目的子模块。但是,如果您不想创建一个新的存储库,您可以尝试这些解决方案之一。

一个分支

中的多个目录

如果您能够将项目配置为使用目录/client_A而不是/client,那么您可以将目录/client克隆到多个目录。

  • /client_A
  • /client_B
  • /client_C

并在每个目录中进行单独的开发。到目前为止,只使用主分支就足够了。

稍后,当您决定“合并”目录/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

从这个开始,请严格使用

  • /client以外目录更改的主(/dtos和/server)
  • branch_A、branch_B、branch_C用于更改/client目录

使用branch_A、branch_B、branch_C构建不同版本的项目。在构建之前,将主分支合并到这些分支中。避免将这些分支合并到主分支(相反方向)。

稍后,您可以将例如branch_A合并为master。但是在这样做之后,您就不能将主服务器合并到branch_B或branch_C中,这意味着您需要选择合适的结束时间,并在此时将所有分支branch_A、branch_B、branch_C合并为master。

票数 1
EN
页面原文内容由Software Engineering提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://softwareengineering.stackexchange.com/questions/349622

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档