【发布时间】:2011-05-05 09:25:51
【问题描述】:
相关问题:why does Git send whole repository each time push origin master
简短版:在使用两个 Git 存储库时,即使 99% 的提交对象相同,使用 git push 将提交发送到存储库B当origin 设置为指向repo A 会导致所有对象(200MB +)被传输。
更长的版本:我们在我们的持续集成服务器上设置了第二个 Git 存储库。在我们在本地准备好提交对象后,我们不再像往常那样直接推送到origin/master,而是将更改推送到第二个存储库上的分支。 CI 服务器选择新分支,将其自动变基到 master,运行我们的集成测试,如果一切顺利,将分支推送到主存储库上的 origin/master。
CI 服务器还会定期调用 git fetch 从主存储库中检索 origin/master 的最新副本,以防有人绕过 CI 流程并直接推送。
这非常有效,尤其是在推送到 CI 存储库之前执行 git fetch; git rebase origin/master 时; Git 只发送不在origin/master 中的提交对象。如果在推送之前跳过 fetch/rebase 步骤,该过程仍然有效,但 Git 似乎将大部分提交对象(如果不是全部)发送到 CI 存储库——目前价值超过 200MB。 (我们的 repo 的新克隆为 225MB。)
我们做错了吗?有没有办法纠正这种行为,使 Git 只发送它需要在 CI 存储库上形成分支的提交对象?我们显然可以通过预先推送git fetch; git rebase origin/master 来解决这个问题,但感觉我们应该能够跳过这一步,特别是因为直接推送到主仓库不会出现同样的问题。
我们的存储库由 Gitosis 0.2 提供服务,我们的客户绝大多数都在运行 msysgit 1.7.3.1-preview。
【问题讨论】:
标签: git continuous-integration msysgit gitosis git-push