Я пытаюсь написать крюк update
для git, который отскакивает, если подмодуль обновляется до идентификатора фиксации, который не существует в репозитории восходящего субмодуля. Чтобы сказать это по-другому, я хочу заставить пользователей вносить изменения в репозитории подмодулей, прежде чем они нажимают изменения на указатели подмодулей.
Одно предупреждение:
- Я хочу только протестировать подмодули, чьи голые, восходящие репозитории существуют на том же сервере, что и родительский репозиторий. В противном случае мы начинаем делать сумасшедшие вещи, такие как call 'git clone' или 'git fetch' из-за крюка git, который не будет забавным.
Я играю с идеей, но, похоже, должен быть лучший способ сделать это. Вот что я планировал сделать в крючке обновления:
- Проверьте, что имя refname передано в hook, чтобы узнать, обновляем ли мы что-либо в
refs/heads/
. Если нет, выйдите рано. - Используйте
git rev-list
, чтобы получить список исправленных изменений. - Для каждой ревизии:
- Вызовите
git show <revision_id>
и используйте регулярное выражение, которое проверяет, обновлен ли подмодуль (путем поиска `+ Subproject commit [0-9a-f] +). - Если это коммитирование изменило подмодуль, получите содержимое файлов
.gitmodules
, как видно из этого конкретного commit (git show <revision_id>:.gitmodules
). - Используйте результаты 3.1 и 3.2, чтобы получить список URL-подмодулей и их обновленные идентификаторы фиксации.
- Проверьте этот список, созданный в 3.3, на внешний файл, который отображает URL подмодулей в локальные голые репозитории git в файловой системе.
-
cd
к путям, найденным в 3.4, и выполнитеgit rev-parse --quiet --verify <updated_submodule_commit_id>
, чтобы узнать, существует ли эта фиксация в этом репозитории. Если это не так, выйдите с ненулевым статусом.
- Вызовите
(Примечание. Я считаю, что результаты 3.2 могут быть кэшированы по версиям до тех пор, пока вывод на git rev-parse --quiet --verify <revision_id>:.gitmodules
не изменится с одной версии на следующую. Я оставил эту часть для упрощения решения.)
Итак, это кажется довольно сложным, и я не могу не задаться вопросом, есть ли какие-то внутренние команды git, которые могли бы сделать мою жизнь намного проще. Или, может быть, есть другой способ подумать о проблеме?