使用两个git存储库(内部和外部)将代码传递到客户端的工作流程

时间:2016-10-06 17:52:47

标签: git git-flow

我有一种情况,客户端将使用Git在版本控制下接收源代码。客户希望跟踪每周冲刺的进度,差异并控制到他们的回购中。最终,客户人员也会对该回购提交。

我的团队(让我们打电话给内部团队)也在使用Git和git-flow工作流程。因此,内部回购的每个发布都应转换为客户端回购中的提交。我们不希望内部仓库上的每个提交都显示在客户端仓库上。

所以我当前的想法/解决方案是使用一个脚本使用rsync将工作目录从内部复制到客户端(在本地文件系统上),然后提交到客户端仓库。这可以作为内部服务器上的后接收挂钩或类似的东西。

解决方案似乎对我来说太笨重了,也许有更好的方法来实现我的需要。还有什么想法?

编辑以包含已接受的解决方案:

正如Scott Weldon所指出的那样,git-merge允许在良好的工作流程中执行此操作。但是,为了使其工作,需要其他标志。一个是允许git有效地合并这两个故事,第二个是为解决冲突提供适当的策略。

因此,假设我从内部回购中合并的引用为release/x.x.x.,则流程为

git fetch internal
git merge --allow-unrelated-histories -s recursive -Xtheirs --squash internal/release/x.x.x
git commit
git push origin master

1 个答案:

答案 0 :(得分:2)

这样做的一种方法是使用Git添加和合并不相交历史的能力。

将内部存储库添加为外部存储库的远程存储库:

git remote add internal ssh://user@host/path.git

每当您在内部仓库中执行发布时,请在外部仓库中执行以下操作:

git fetch internal
git merge --squash internal/master
git commit
git push origin master

这将在外部仓库中创建一个提交,其中包含自上次合并以来internal/master的任何更改。

来自git merge的手册页:

  

--squash

     

生成工作树和索引状态,就好像发生了真正的合并(合并信息除外),但实际上没有提交,移动HEAD或记录$GIT_DIR/MERGE_HEAD(导致用于创建合并提交的下一个git commit命令。这允许您在当前分支之上创建单个提交,其效果与合并另一个分支相同(或者在章鱼的情况下更多)。

因此,如果没有--squash标记,internal的历史记录将包含在外部仓库中。

如果您使用的是Git> = 2.9的版本,那么您还需要将--allow-unrelated-histories标志添加到git merge命令,因为Git默认会拒绝合并不相关的历史记录。请参阅Git refusing to merge unrelated histories