Смежный вопрос: почему Git отправляет весь репозиторий каждый раз, когда мастер отправки отправляет
Краткая версия: При работе с двумя репозиториями Git, даже если 99% объектов коммитов идентичны, используйте git push
для отправки коммита в репозиторий B при origin
настроен на репо A вызывает передачу всех объектов (200 МБ +).
Гораздо более длинная версия: У нас есть второй репозиторий Git, настроенный на нашем сервере непрерывной интеграции. После того, как мы подготовили наши объекты коммитов локально, вместо того, чтобы прямо нажимать на origin/master
, как обычно, мы вместо этого отправляем наши изменения в ветвь этого второго репозитория. Сервер CI выбирает новую ветку, автоматически перебазирует ее на master
, запускает наши интеграционные тесты и, если все хорошо, выдвигает ветку на origin/master
в главном репо.
Сервер CI также периодически вызывает git fetch
для получения последней копии origin/master
из основного репо, если кто-то обошел процесс CI и нажал прямо.
Это прекрасно работает, особенно если кто-то делает git fetch; git rebase origin/master
перед тем, как перейти к репозиторию CI; Git отправляет только те объекты фиксации, которых нет в origin/master
. Если пропустить шаг выборки / перебазирования перед нажатием, процесс все еще работает, но Git, по-видимому, отправляет, если не все, большинство объектов коммитов в репозиторий CI - в настоящее время стоимостью более 200 МБ. (Свежий клон нашего репо имеет размер 225 МБ.)
Мы что-то делаем не так? Есть ли способ исправить это поведение так, чтобы Git отправлял только те объекты фиксации, которые ему нужны для формирования ветви в репозитории CI? Очевидно, что мы можем обойти эту проблему, выполнив предварительный пуш git fetch; git rebase origin/master
, но такое ощущение, что мы должны пропустить этот шаг, особенно потому, что пуш напрямую в мастер репо не представляет той же проблемы.
Наши репозитории обслуживаются Gitosis 0.2, и наши клиенты в подавляющем большинстве случаев запускают msysgit 1.7.3.1-preview.