Как я могу гарантировать, что все коммиты подмодулей, на которые ссылается суперпроект git, действительны (и остаются действительными)? - PullRequest
0 голосов
/ 10 июля 2020

Как разработчик, у меня есть суперпроект, использующий подмодуль. Я могу настроить git, чтобы гарантировать, что коммиты суперпроекта имеют действительные ссылки на подмодули во время их отправки (git config push.recurseSubmodule check).

Могу ли я настроить git / BitBucket, чтобы гарантировать, что ссылки gitlink, на которые ссылается мой суперпроект всегда будет существовать в подмодуле?

В частности, меня беспокоит следующий сценарий:

  • разработчик отправляет фиксацию подмодуля в ветку функции
  • разработчик подталкивает фиксацию суперпроекта, которая ссылается на фиксацию ветки функций подмодуля
    • pu sh в суперпроект разрешено конфигурацией, поскольку gitlink в настоящее время действителен на удаленном
  • впоследствии разработчик удаляет ветку функции подмодуля, не объединяя ее
    • суперпроект теперь не работает: у него есть gitlink к фиксации, которой нет в удаленном

Мне нужно сохранить контроль над тем, что указано в супер (я не хочу автоматически следовать ветке в подмодуле).

Возможные подходы:

  1. Есть ли способ с помощью git или BitBucket обеспечить выполнение этого суперпроекта может содержать только gitlink-ссылки субмодуля, которые находятся в основной ветке подмодуля? ... или какой-то лучший подход здесь, которого я вообще не вижу? работай! Я думаю, это связано с тем, что SHA ветки функций на пульте дистанционного управления не удаляется немедленно (стратегия сокращения reflog по умолчанию - сохранить историю за 90 дней).

1 Ответ

1 голос
/ 10 июля 2020

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

В качестве академического c упражнения, если бы вы использовали Git, а не битбакет для выполнения слияния, проверки были бы как пять строк ловушки,

git rev-list ..MERGE_HEAD` | xargs -rn1 git ls-tree -rd \
| awk '$2=="commit" {print $3}' | sort -u

, чтобы показать вам каждое слияние фиксация подмодуля и

[[ `git for-each-ref --count=1 ---format=ok  --contains $commit \
        refs/remotes/origin/{master,stable}` = ok ]]

, чтобы проверить, находится ли $commit в последней основной или стабильной истории происхождения, поэтому минимально жизнеспособный-дымовой тест для того, что вам нужно, будет

for commit in $(git rev-list ..MERGE_HEAD` | xargs -rn1 git ls-tree -rd \
                | awk '$2=="commit" {print $3}' | sort -u); do
        [[ `git for-each-ref --count=1 ---format=ok  --contains $commit \
                refs/remotes/origin/{master,stable}` = ok ]] || die "Commit $commit is not published"
done

push.recursesubmodules check делает в значительной степени именно это, только без специальных c ограничений удаленного доступа и отслеживания

Примечание:

Обычная практика, с которой я знаком, заключалась в том, чтобы различать guish административный статус по месту жительства репо, команда QA имеет тенденцию запускать ~ входящее ~ репо, на которое разработчики или группы проверки pu sh коммитят серию для интеграции, и производственная группа также будет иметь репозиторий для кода, отправленного в производство, и так далее. Таким образом, каждая команда может доверять людям, которых она знает лично, и автоматически проверять входящие данные в предварительном приеме. Во всех репозиториях публикации действительно должны проводиться тесты на работоспособность на входах, и вещи, подобные приведенному выше, были бы хорошими кандидатами.

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