Повторно использовать git деревьев на толчке - PullRequest
0 голосов
/ 28 февраля 2020

Преамбула:

Я экспериментирую с использованием функции дедупликации git для бинарных развертываний.

Да, я знаю, что большинство источников говорят, что это плохая идея (tm) , но в моих тестах до сих пор это на самом деле прекрасно работало.

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

На стороне клиента, с fetch, это прекрасно работает.

Я делаю git init и git remote add origin [url], а затем получаю только указанные c версия с git fetch origin [version].

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


Проблема: наблюдается поведение на пу sh:

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

Как я понимаю, это потому, что у толкаемого коммита нет родителей.

Если есть отношение «родитель-потомок», оно будет повторно использовать объекты в pu sh.

Вопрос:

Есть ли способ сказать git повторное использование объектов в pu sh, даже если коммит, который я нажимаю, является сиротой?

Я думаю, что обходным решением может быть линейная история коммитов, затем выполните git fetch --depth 1 на клиенте.

Ответы [ 2 ]

1 голос
/ 29 февраля 2020

Когда вы набираете sh с помощью Git, обе стороны согласовывают, какие объекты у них есть, а затем клиент отправляет все недостающие данные на сервер. То, как они это делают, зависит от протокола, но, по сути, они согласовывают друг друга в зависимости от используемых ссылок, а также от дополнительных элементов, которые обе стороны могут получить от них.

Если у вас большое количество ветвей-сирот, Git вряд ли попытается пройтись по другим ссылкам, так как предполагается, что они, вероятно, не имеют много общих объектов. Точные детали не задокументированы, но обычно это безопасное предположение. Алгоритм обхода ревизий, используемый во время выборок и посылок, не настраивается, потому что (a) обычно он работает хорошо и (b) обычно отправка небольшого количества дублирующих объектов не является вредной.

В целом, хотя, как и большинство источники сказали вам, что это плохая идея. Git не является хорошим инструментом развертывания по многим причинам. Есть инструменты, которые лучше подходят для этого и более гибкие, такие как Capistrano.

0 голосов
/ 29 февраля 2020

если я создаю фиктивный коммит, у которого есть родитель и он делит дерево с сиротой, тогда pu sh оба они одновременно, git может понять это :

Допустим, у меня есть две сиротские ветви, v1 и v2. v1 уже был перенесен на сервер, теперь я хочу pu sh v2.

Если я просто git push origin v2:refs/heads/v2, то он все выталкивает.

Но это работает:

Создать новый фиктивный коммит из того же дерева
v2-dummy = git commit-tree v2^{tree} -p v1 -m "v2"

Pu sh оба они с помощью одной и той же команды (это важная часть)
git push origin v2-dummy:refs/heads/v22-dummy v2:refs/heads/v2

удалить манекен
git push -d origin v2-dummy

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