Я использую подход, похожий на этот, чтобы использовать привязку pre-commit для отслеживания изменений в моей схеме базы данных (а также несколько метаданных - ish).
Мне нравится пытаться сохранить мои коммиты в чистоте, поэтому я хочу, чтобы их громко предупреждали в сообщении о фиксации, когда были произведены автоматические изменения. Вот мои крюки pre-commit
и pre-commit-msg
:
.git/крючки/предварительной фиксации
#!/bin/sh
# Save user changes to db/ (if any)
git diff --quiet db/
user_dirty=$?
[[ $user_dirty > 0 ]] && git stash save --keep-index
# Regenerate db/ automatically
db/save_schema_and_meta_tables.sh
# Were any automatic changes made? If so, commit them but warn about it
git diff --quiet db/
auto_dirty=$?
if [[ $auto_dirty > 0 ]]; then
git add db/
echo "WARNING: automatic changes to db/ added to commit" | tee .git/COMMIT_WARNING
fi
[[ $user_dirty > 0 ]] && git stash pop
exit 0
.git/крючки/подготовить фиксации-MSG
#!/bin/sh
msgf=$1
wf=.git/COMMIT_WARNING
if [ -e $wf ]; then
msg=$(<$msgf)
( cat $wf; echo "$msg" ) > $msgf
rm -f $wf
fi
Вот как он себя ведет:
- Если я внес изменения в
db/
, но еще не поставил их, они сохраняются в рабочем дереве, не нарушая фиксацию, благодаряstash save --keep-index
иstash pop
. Хорошо! - Однако, если у меня поставлено изменяется на
db/
, и они перезаписываются автоматическим фиксацией, то после фиксации пользовательские изменения исчезают. Плохо!
Вот что я мог бы как: если есть внесенные пользователем изменения в db/
, и они точно не соответствуют автоматическим изменениям, то все это должно быть прервано. У меня много проблем с выяснением того, как это реализовать: как я могу сохранить поэтапные изменения, сделанные пользователем, а затем посмотреть, не совпадают ли автоматические изменения?