Редактирование, намного позже: Начиная с Git 1.7.7, git-push
теперь имеет опцию --recurse-submodules=check
, которая отказывается выдвигать родительский проект, если какие-либо коммиты субмодуля не были переданы на их пульты. Похоже, что соответствующий параметр конфигурации push.recurseSubmodules
был добавлен. Это, конечно, не полностью решает проблему - невежественный пользователь все еще может нажать без чека - но это весьма актуально!
Я думаю, что лучший подход, вместо того, чтобы изучать каждый отдельный коммит, - это просматривать различия между всеми выдвинутыми коммитами: git diff <old> <new>
. Вы действительно не хотите смотреть на все различия; это может быть огромным. К сожалению, команда git-submodule porcelain не работает в пустых репозиториях, но вы все равно сможете быстро просмотреть .gitmodules
, чтобы получить список путей (и, возможно, URL). Для каждого из них вы можете git diff <old> <new> -- path
, и, если есть diff, взять новый коммит подмодуля. (И если вы беспокоитесь о возможности фиксации 000000, вы можете просто использовать git show
на новой, я считаю.)
После того, как вы позаботились обо всем, вы сократили проблему до проверки наличия заданных коммитов в заданных удаленных репозиториях. К сожалению, как вы уже заметили, это не так просто, по крайней мере, , насколько я знаю . Сохранение локальных, современных клонов - это, вероятно, ваш лучший выбор, и, похоже, вам там хорошо.
Кстати, я не думаю, что кеширование будет здесь уместным, так как перехват обновления выполняется один раз за ссылку. Да, вы могли бы сделать это в ловушке перед получением, которая получает все ссылки на stdin, но я не понимаю, почему вы должны потрудиться делать больше работы. Это не будет дорогой операцией, и с помощью хука обновлений вы можете по отдельности принимать или отклонять различные ветви, которые выдвигаются, вместо того, чтобы помешать всем из них обновить, потому что только одна была плохой.
Если вы хотите избавиться от каких-либо проблем, я бы, вероятно, просто не стал разбирать файл gitmodules и жестко закодировал список в ловушку. Я сомневаюсь, что ваш список подмодулей меняется очень часто, поэтому, вероятно, дешевле поддерживать его, чем писать что-то автоматизированное.