相关问题:为什么 Git 每次 push origin master 时都会发送整个存储库
简短版本:当使用两个 Git 存储库时,即使 99% 的提交对象是相同的,当设置为指向存储库Agit push
时,使用将提交发送到存储库B会导致所有对象 (200MB +) 被传输。origin
更长的版本:我们在持续集成服务器上设置了第二个 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。(我们的 repo 的新克隆为 225MB。)
我们做错了什么吗?有没有办法纠正这种行为,使 Git 只发送它需要在 CI 存储库上形成分支的提交对象?我们显然可以通过 pre-push 来解决这个问题git fetch; git rebase origin/master
,但感觉我们应该能够跳过这一步,特别是因为直接推送到主仓库不会出现同样的问题。
我们的存储库由 Gitosis 0.2 提供服务,我们的客户绝大多数都在运行 msysgit 1.7.3.1-preview。