我有一种情况,客户端将使用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
答案 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。