#git #git-submodules
#git #git-подмодули
Вопрос:
У меня есть проект, в котором я заставляю себя помечать и «освобождать» подмодуль, прежде чем я смогу разрешить родительскому элементу обновляться. Иногда я забываю и должен делать это задним числом. Интересно, есть ли способ обеспечить соблюдение правила, согласно которому подмодуль может обновлять только коммиты, помеченные в подмодулированном репозитории?
Ответ №1:
Нет действительно хорошего способа сделать это непосредственно в самом подмодуле (хотя вы можете написать свои собственные Git-хуки, которые помогут напоминать вам о выполнении любой работы в подмодуле). Но вы можете написать скрипт предварительной фиксации, который будет напоминать вам всякий раз, когда вы собираетесь сделать новый коммит в суперпроекте.
В вашем перехватчике предварительной фиксации вы будете:
- сравните текущий коммит (
HEAD
) с предлагаемым новым коммитом (содержимым индекса); - посмотрите, связаны ли какие-либо изменения с записью gitlink: индексной записью,
mode
являющейся160000
(т.Е. gitlink); - если да, проверьте соответствующий подмодуль: проверьте, соответствует ли хэш коммита в индексе superproject помеченному коммиту в этом подмодуле.
Чтобы выполнить сравнение текущей фиксации с индексом, запустите:
git diff-index --cached HEAD
который выдает результат, подобный этому:
:100644 100644 ee6fb78cd4a415358558373f176e2bbb7e5e603f 3e4b8b8874e67bda27ebee646c97989e0aa98c5e M Vagrantfile
:100644 100644 b7ad08494ad84d9d816b7d84f4e75ddf9a6549a2 e12f4afad5e59623b3cf07af459cb1f096c14c25 M defaults.yml
:100644 100644 9e69570de9caa3e8f1979d9fcf8ad8ddf3992291 c28dd95ca0a7033a224a35302c6ccbbf1612c3a3 M dev.yml
:100644 100644 e3588c8e7fc19f075f0f83a5e3df3e71e4ee9152 6655fa801bcf442a1b8b8b1a269391cb0807d0bd M local.yml
Для каждой строки, которая имеет :160000 160000
(ни одна из приведенных выше строк), старый хэш находится слева, а новый — справа, так что вы можете запустить это через (например) awk
или использовать скрипт Python для поиска интересных записей. Обратите внимание, что имя файла отделено от остальной части строки табуляцией (увеличенной до пробелов выше для целей публикации), и если вы используете Python или что-то подобное, вы можете добавить -z
в git diff-index
команду, чтобы упростить машинное чтение выходных данных. Подробности см. в документации.