Несколько замечаний для всех, кто сталкивается с этим!
Самая большая ошибка, которую собираются сделать новобранцы, это совершить отключение HEAD в подмодуле после выполнения обновления подмодуля.Я собираюсь попытаться противостоять этому с помощью сильных предупреждений от хуков.
Следующим по величине, вероятно, будет сбой при обновлении субмодуля после проверки, которая требует его.Снова, ловушки могут проверить это и предупредить.
Что касается процесса разработки, эта настройка делает гораздо более важным иметь хорошую тестовую инфраструктуру в подмодуле, так что, если возможно, вы можете работать в ней без необходимостиработайте в родительской среде и полностью избежите этой проблемы.
Я постараюсь опубликовать пример кода из хуков, которые я в конечном итоге использую, и через месяц дополню (надеюсь, не слишком много) настоящими ужасными историями.
Редактировать:
Вот первые наброски крючков.Имейте в виду, что это срочно, и мне легко!
В родительском репо:
Для пост-слияния и пост-извлечения мы предупреждаем пользователя, если субмодуль не синхронизирован,(пост-слияние включено, в частности, для ускоренного слияния, извлечения из источника). Также обратите внимание, что они захотят проверить ветку, хотя ловушка после извлечения субмодуля также сделает это при запуске обновления субмодуля.Чем больше напоминаний, тем лучше.
#!/bin/bash
if git submodule status | grep '^+' > /dev/null; then
echo "WARNING: common model submodule now out of sync. You probably want to run" 1>&2
echo " git submodule update, then make sure to check out an appropriate branch" 1>&2
echo " in the submodule." 1>&2
fi
Для пост-фиксации, если есть изменения субмодуля, мы предупреждаем пользователя, что он, возможно, забыл включить их в свой коммит.В этом сильно связанном случае это очень хорошее предположение.Маловероятно, что пользователь изменил симуляцию и обычные модели отдельно .
#!/bin/bash
if git submodule status | grep '^+' > /dev/null; then
echo "WARNING: common model submodule has changes. If the commit you just made depends" 1>&2
echo " on those changes, you must run git add on the submodule, and then run" 1>&2
echo " git commit --amend to fix your commit." 1>&2
fi
А в подмодуле - пост-кассовый хук, чтобы строго предупредить о отключенной HEAD:
#!/bin/bash
get_ppid() {
ps --no-headers -o ppid $1
}
# Check to see if this checkout is part of a submodule update
# git submodule calls git checkout, which calls this script, so we need to
# check the grandparent process.
if ps --no-headers -o command $(get_ppid $(get_ppid $$)) | grep 'submodule update' &> /dev/null; then
if ! git symbolic-ref HEAD &> /dev/null; then
echo "WARNING: common model submodule entering detached HEAD state. If you don't know" 1>&2
echo " what this means, and you just ran 'git submodule update', you probably" 1>&2
echo " want to check out an appropriate branch in the submodule repository." 1>&2
echo
# escape the asterisk from SO's syntax highlighting (it sees C comments)
branches=($(git for-each-ref --format='%(objectname) %(refname:short)' refs/heads/\* | grep ^$(git rev-parse HEAD) | cut -d\ -f2))
case ${#branches} in
0 )
;;
1 )
echo "Branch '${branches[0]}' is at HEAD"
;;
* )
echo "The following branches are at HEAD: ${branches[@]}"
;;
esac
fi
echo
fi
Я также добавляю ловушку перед фиксацией, чтобы просто прервать коммиты, сделанные с отсоединенным HEAD (если это не перебазировка).Я в ужасе от того, что классическая «все мои коммиты исчезли» запаниковала.Вы всегда можете обойти это с помощью --no-verify
, если знаете, что делаете.