LINUX.ORG.RU

Зеркало git

 ,


0

2

Стоит задача - есть удаленный репозиторий, который изначально использовался как основной (при push/pull-е). Но канал связи медленный и скорость не устраивала, к примеру clone «с нуля» сейчас занимает часов 20, большие коммиты тоже напрягают. Задался вопросом «подъема» локального зеркала, на который будут push-ить локальные разработчики, и который периодически будет синхронизироваться с удаленным. На удаленке в этот репозиторий почти никто не коммитит, и задержки с обновлением коммитов «от нас» должны устроить.

Есть решение делать

git clone --bare <url>

И периодически пушить то что в локальном зеркале обновилось:

git push origin --mirror

Но тогда потеряются все коммиты в удаленном репозитории. Коммиты не «от нас» туда редки но не хотелось бы их потерять, если вдруг появятся. Кроме того первое время, как поднимем зеркало, наверняка многие по старинке будут коммитить в удаленный.

Можно периодически делать

git remote update
но тогда ситуация обратная - перетрутся все локальные коммиты.

Хотелось бы чтобы можно было делать merge изменений. Чтобы не терялись коммиты ни на одном из источников.

P.S. Не подумайте я не админю всю инфраструктуру, я разработчик, от наших админов переделки будет добиться будет сложно (перенести этот репозиторий к нам), хотелось бы своими силами развернуть зеркало.

P.P.S. Как правильно mirror'ить GIT репозиторий? я читал, как там мерджить коммиты я не понял т.к. после clone --bare pull вроде бы не доступен.

mirror

git remote add upstream ....
git pull --rebase upstream master
git push -f

work

git commit ...
git commit ...
git commit ...
git push
git pull --rebase upstream master
git push 

grab

git remote add forked....
git merge forked master # <- DANGER
git push
Nensha ()

Идею автоматических мержей нужно сразу бросить. Просто делайте так, чтобы в обоих репозиториях присутствовали и ваши, и сторонние коммиты. Для этого нужно просто периодически pull/push-ить изменения на вашем локальном сервере. А мержить будете вручную.

Sorcerer ★★★★★ ()
Ответ на: комментарий от Sorcerer

Я как раз имел в виду, что мерджить в ручную, то есть чтобы просто отслеживалась ситуация конфликта, хотя если бы выполнялся авто-merge как делается при обычной работе, когда тривиальная ситуация возникает было бы очень удобно

Ex-bluesbreaker ()
Ответ на: комментарий от Ex-bluesbreaker

Тогда сделайте скрипт, который сначала делает pull удалённого репозитория, потом выполняет попытку merge с вашими изменениями согласно вашему workflow (при неудаче оставляет как есть, т.е. как было до попытки merge), а затем уже делает push ваших изменений вместе с мерджами на удалённый сервер. Какие конкретно команды писать - не подскажу, т.к. не спец по git.

Sorcerer ★★★★★ ()
Последнее исправление: Sorcerer (всего исправлений: 2)
Ответ на: комментарий от Ex-bluesbreaker

Главное - не изменяйте уже существующие ревизии на вашем местном сервере (т.е. никаких fast-forward меджей и пр.), иначе получите много неприятных замечаний от коллег. :) Можно только добавлять новые ревизии.

Sorcerer ★★★★★ ()

Может стоит делать свои коммиты напрямую, а pull уже с зеркала? Тогда проблемы мерджей не должно быть. А разруливать мерджи на зеркале - идея плохая.

Pavval ★★★★★ ()
Ответ на: комментарий от red_eyed_peguin

Шикарно!

Всем спасибо за помощь, проблема решена. Использовать read-only зеркало, пожалуй, самое правильно решение.

Ex-bluesbreaker ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.