Как протолкнуть / вытащить git коммиты через пару FIFO?
Я хотел бы знать, как использовать пару fifos в качестве средства для обмена коммитами между клонами репозитория Git.
Git-remote-fd документирует, как использовать это с точки зрения клиента, но не дает никакого примера, как настроить связанную серверную часть.
До сих пор я пытался сделать следующее:
# Prepare repos.
git init a
(cd a && echo one > file1 && git add file1 && git commit -m first)
git clone a b
(cd a && echo two > file2 && git add file2 && git commit -m second)
mkfifo ab && mkfifo ba
# Now I want to push from a to b via the fifos
(cd a && git push fd::8,9 master) 8< ba 9> ab &
(cd b && git pull fd::9,8 master) 8> ba 9< ab
Но не повезло. В порта очевидно заблокировать. Команды висят и никогда не завершаются.
Я думаю, что "git push" не является правильной командой для серверной части, и "мерзавец отправить-пакет" или "мерзавец загрузки-пакет" будет более уместным. Но мне трудно понять, как на самом деле использовать обе команды.
Есть идеи?
1 ответ:
Piping git commits through pipes легко использовать
git receive-pack
иgit upload-pack
.Обычно
git receive-pack
иgit upload-pack
принимают 1 аргумент, каталог git (каталог, содержащий папкуobjects
), а затем выполняют полную дуплексную связь через его stdin/stdout с удаленным push/pull git.Вызов команды
git receive-pack
вручную прост:mkfifo ab && mkfifo ba # Now I want to push from a to b via the fifos (git receive-pack b/.git) 1> ba 0< ab & (cd a && git push fd::8,9 master) 8< ba 9> ab
Таким же образом для
git upload-pack
:Обратите внимание, чтоmkfifo ab && mkfifo ba # Now I want to push from a to b via the fifos (git upload-pack a/.git) 1> ab 0< ba & (cd b && git pull --no-edit fd::8,9 master) 8< ab 9> ba
git pull
иgit push
не являются в точности обратными операциями каждого из них. другое:
git push
отказывается нажимать по умолчанию, когда у другой стороны есть коммиты, которых у нее нет (если только-f
не дал, то он перезапишет`), в то время как pull делает коммит слиянияgit pull
может открыть редактор для редактирования коммита слияния, если флаг--no-edit
не был задан (потенциальный эксплойт безопасности, если редактор vi)