相关问题:为什么 Git 每次推送 origin master 时都会发送整个存储库 https://stackoverflow.com/questions/1381403/why-does-git-send-whole-repository-each-time-push-origin-master
简短版本:当使用两个 Git 存储库时,即使 99% 的提交对象是相同的,使用git push
将提交发送到存储库B when origin
设置为指向 repoA导致所有对象(200MB +)被传输。
更长的版本:我们在持续集成服务器上设置了第二个 Git 存储库。当我们在本地准备好提交对象后,而不是直接推送到origin/master
像通常一样,我们将更改推送到第二个存储库上的分支。 CI 服务器选取新分支,自动将其重新定位到master
,运行我们的集成测试,如果一切顺利,则将分支推送到origin/master
在主仓库上。
CI服务器也会定期调用git fetch
检索最新的副本origin/master
来自主存储库,以防有人绕过 CI 流程并直接推送。
这非常有效,特别是如果一个人做了git fetch; git rebase origin/master
在推送到 CI 存储库之前; Git 只发送尚未存在的提交对象origin/master
。如果在推送之前跳过 fetch/rebase 步骤,该过程仍然有效,但 Git 似乎会将大部分提交对象(如果不是全部)发送到 CI 存储库 — 目前价值超过 200MB。 (我们存储库的新克隆大小为 225MB。)
我们做错了什么吗?有没有办法纠正这种行为,使 Git 只发送在 CI 存储库上形成分支所需的提交对象?显然我们可以通过预推送来解决这个问题git fetch; git rebase origin/master
,但感觉我们应该能够跳过这一步,特别是因为直接推送到主存储库不会出现同样的问题。
我们的存储库由 Gitosis 0.2 提供,我们的客户绝大多数都运行 msysgit 1.7.3.1-preview。
...自动将其重新定位到master
...
我认为这就是问题的根源。每次你的 CI 服务器执行这个自动变基步骤时,它都会创建一个完整的new相对于当前分支和主分支最近的共同祖先的提交集。
下次您将代码推送到 CI 服务器时,它实际上不再拥有所有这些对象(无法从任何活动头访问它们),因此它会请求您的客户端再次发送所有这些对象。
您应该能够通过观察您正在进行的提交的 SHA1 提交 ID 来看到这种情况的发生。您可能会发现本地提交的提交 ID 不再与 CI 服务器上的 rebased 分支中相应的提交 ID 匹配。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)