Как протолкнуть / вытащить 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 2

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)