Выборка нескольких пультов Git параллельно - PullRequest
0 голосов
/ 30 августа 2018

Можно ли в git получать несколько пультов параллельно?

Будет ли работать приведенный ниже код без блокировки файла git в хранилище.

git config gc.auto 0
git remote |xargs --max-procs=4 -n 1 git fetch
git gc

У меня был небольшой тест с несколькими репозиториями, и, похоже, он работает, когда все репозитории не связаны друг с другом.

Было бы неплохо получить обратную связь, если есть четкая техническая причина, по которой приведенная выше команда параллельной выборки не будет работать.

Подмодуль поддерживает параллельную выборку, но параллельная выборка будет полезна при использовании подхода git-subtree.

Аналогичный вопрос: git pull несколько пультов параллельно

Ответы [ 2 ]

0 голосов
/ 15 июля 2019

но окончательная переупаковка может закончиться неудачей, если вы не сделаете то, что сделали, отключите auto-gc и затем запустите GC самостоятельно

На самом деле, с Git 2.23 (Q3 2019), в этом больше нет необходимости.

"git fetch", который захватывает группу удаленных пользователей, научившихся запускать auto-gc только один раз в самом конце.

См. коммит c3d6b70 (19 июня 2019 г.) от Нгуен Тай Нгок Дуй (pclouds) .
(Объединено с Junio ​​C Hamano - gitster - в коммит 892d3fb , 09 июля 2019 г.)

fetch: запускать gc только один раз при загрузке нескольких пультов

В режиме нескольких пультов git-fetch запускается для пультов n-1, и последний пульт обрабатывается текущим процессом. Каждый из этих процессов, в свою очередь, будет запускать 'gc' в конце.

Это на самом деле не проблема, потому что даже если запущено несколько 'gc --auto' в то же время мы по-прежнему справляемся с этим правильно.
Он показывает несколько сообщений «автоматическая упаковка в фоновом режиме».
И мы можем тратить некоторые ресурсы, когда gc фактически выполняется, потому что мы все еще делаем что-то перед проверкой блокировки и перемещением ее в фоновый режим.

Итак, давайте попробуем избежать этого.

Нам нужен только один прогон 'gc' после добавления всех объектов и ссылок.

Добавить новую опцию --no-auto-gc, которая будет использоваться этими n-1 процессами.
'gc --auto' всегда будет выполняться в процессе основной выборки (*).

(*), даже если в какой-то момент в будущем мы получим пульты параллельно, это все равно должно быть хорошо, потому что мы должны «присоединиться» ко всем этим процессам до этого шага.

0 голосов
/ 30 августа 2018

Ответ на самом деле возможно . В частности:

git remote | xargs --max-procs=4 -n 1 git fetch

Как вы видели, это действительно работает при тестировании, вплоть до определенного момента. Однажды я написал причудливую версию того же рода вещей (с причудливым управлением отображением процесса извлечения, все написано на Python), но оказывается, что в git fetch --progress есть ошибка, так что она не работает с конвейерами ; вы должны использовать ptys).

без столкновения с блокировкой файла git ... похоже, работает, когда все репозитории не связаны друг с другом.

В этом и заключается проблема: каждый выбор предполагает, что он может получить свои блокировки. Выборки должны блокировать каждое имя для удаленного отслеживания, и обычно оно работает просто отлично, так как имена являются отдельными - удаленный A не мешает удаленному B, потому что refs/remotes/A/master и refs/remotes/B/master используют разные блокировки - но последняя перепаковка может закончиться неудачей, если вы не сделаете то, что сделали, отключите auto- gc, а затем запустите GC самостоятельно (после этого вы должны будете повторно сделать это повторно).

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...