我们有两个不同的团队,每个团队都在自己的位置上与git合作,每个位置都有一个参考资料库。每个位置都可以访问企业网络,但是两个网络不能直接连接(请问我,请问我):我们只能交换文件。我们希望能够定期同步这两个位置,以便可以通过各自的参考资料库共享工作。
要求:
非要求:
答案 0 :(得分:1)
到目前为止,我的解决方案是使用git bundle
命令,依靠远程引用来跟踪其他位置已经存在的内容,我想出了一些涉及的步骤来通过push携带这些远程引用/拉。将我们的位置称为站点a,将远程位置称为站点b。
生成分发包以发送到远程位置:
~/work$> git clone $LOCAL_REF_URL --mirror bundler
~/work$> cd bundler
~/work/bundler$> git bundle create ../bundle-site-a-$(date +%Y-%m-%d) --branches --tags --not --remotes=site-b
捆绑器工作存储库现在可能会被丢弃。
从远程位置集成捆绑包:
~/work$> git clone -n $LOCAL_REF_URL bundle-integration
~/work$> cd bundle-integration
~/work/bundle-integration$> git checkout --detach
~/work/bundle-integration$> git fetch origin 'refs/heads/*:refs/heads/*' 'refs/remotes/site-b/*:refs/remotes/site-b/*'
~/work/bundle-integration$> git remote add site-b ../bundle-site-b
~/work/bundle-integration$> git fetch --tags site-b 'refs/heads/*'
git fetch . 'refs/remotes/site-b/*:refs/heads/*'
,可以一击而过,然后是git checkout $BRANCH && git merge site-b/$BRANCH
:其他都可以:历史的任何一面都无法重写。此外,删除捆绑软件已考虑但不再包含的分支。git push --tags origin 'refs/heads/*:refs/heads/*' 'refs/remotes/site-b/*:refs/remotes/site-b/*' --prune
完全成功,则返回;我们完成了~/work/bundle-integration$> git fetch origin
(常规)git checkout $BRANCH && git merge origin/$BRANCH
习惯用法中),如果您愿意的话可以重新设置工作bundle集成工作存储库现在可能会被丢弃。
注意:第1步不能只是镜像克隆,因为--mirror不仅会假定--bare,还会强制执行它,这与以后执行集成的需求是不兼容的:即使是琐碎的(快进)git merge操作需要一个非裸仓库。为了使HEAD
远离任何分支,必须执行第3步,否则,如果第4步试图直接更新HEAD
指向的分支,则第4步将失败。步骤4是必需的(它不会获取任何提交),因为它将设置所有必要的引用,因为远程捆绑包可能不一定包含所有分支(它省略了不提供任何更新的分支),最后,我们将继续根据我们自己的分支从起源修剪分支,所以我们要从所有起源的分支开始;在此步骤中将refspecs指定为-c选项,而不是将初始克隆指定为初始克隆。第5步是必需的,因此git知道在第6步中更新refs/remotes/site-b/*
中的引用。
当远程位置已确认能够提取发送给他们的分发包的内容时,更新远程跟踪引用:
这是按照“从远程位置集成分发包”中的步骤完成的,除了将已发送的分发包当作来自远程位置的分发包一样;显然,在这种情况下,无需进行整合工作,因为来自我们位置的分支机构必须与捆绑包中的信息保持最新。