我需要将git repos同步到“气隙式”系统,在系统上创建镜像环境。文件必须通过批准的特殊渠道进行传输。新代码还必须经过漫长的审查和批准过程,然后才能被允许进入系统。
代码发展很快,我想每周对特定分支进行同步-好像我只是在执行git pull。重新传输整个git repo并不是真正的选择。清除我们的审核和批准以仅审核代码差异会容易得多。
有没有办法使用捆绑软件或归档文件或diff-tree或类似的方法将新的变更集仅转储到文件中,并在空缺系统上从该文件进行git pull / fetch来更新存储库?
我浏览了有关补丁,档案,差异树和以前的答案的文档,但是我认为这些都不能完全满足我的需求。
答案 0 :(得分:4)
Git不处理也不存储差异。 Git使用并存储提交(依次存储树和blob)和标签(通常标记提交,存储树和blob)并对其进行存储。
也就是说,git bundle
是您要查找的命令:基本上是git fetch
的服务器端一半,其输出是{{1}客户端上的}可以阅读。因此,您将产生捆绑软件的机器当作一台服务器来对待:告诉它客户端已经拥有的提交内容,以及认为客户端在收到客户端尚未提取的内容时应该看到的分支名称。实际运行。然后,如果后来的git fetch
实际上可以到达服务器,则服务器(构建捆绑包)将打包与git fetch
相同的数据。
然后,您将数据(例如,通过USB记忆棒)手动传送到客户端,将其插入客户端,然后在客户端上,对数据文件运行git fetch
,直到对于客户端而言,它现在是从位于文件内部(例如,USB棒内部)的服务器通过电线实时检索的。
最大的麻烦是,由于USB记忆棒(或其他)不是真正的服务器,因此客户端实际上并未与服务器实时通信,因此必须在服务器上获得了git fetch
命令。如果您错过了任何提交,则提取将失败。如果提交的次数过多,则获取将成功,因此,要“正确处理”,可以先捆绑整个存储库或某些特定的分支集,然后在发送方保存标记以记住捆绑的内容。因此,the git bundle
documentation中的示例:
git bundle
您现在将machineA$ cd R1
machineA$ git bundle create file.bundle master
machineA$ git tag -f lastR2bundle master
转移到“客户端”并可以从该文件克隆。
稍后,file.bundle
进行了新的提交之后,您可以运行:
machineA
到(a)将新的提交发送到客户端,并且(b)更新服务器端对您发送给客户端的提交的内存。 (当然,稍后会通过USB记忆棒或其他方式进行实际发送。)
此标记实际上只是任何任意的提交哈希ID,或者是用作其名称的名称,或用于建立服务器将假定客户端已经拥有的“基本提交”的其他名称。
(请注意,捆绑包包含一个“瘦包”,即,针对服务器认为客户端拥有的对象进行增量压缩的对象。客户端将根据需要添加瘦包,因为Git不喜欢依赖于此一种增量压缩-瘦包仅在网络连接期间被允许,包括伪造的带有这种气隙的包。空的基础意味着该包毕竟不是薄的,而是整个存储库)