О-о, этот вопрос, похоже, проскочил сквозь трещины.Надеюсь, вы все еще там, Эсбен!
Вам нужен хук обновления , который запускается один раз для каждого обновления ссылки.Аргументами являются имя ссылки, имя старого объекта (commit SHA1) и имя нового объекта.
Итак, все, что вам действительно нужно сделать, это проверить разницу между старым и новым и убедиться, чтоэто соответствует вашим стандартам.Конечно, это не совсем просто, но вполне управляемо.Вот что я сделал бы:
Сохраните следующий скрипт в .git/hooks/update
.
old=$2
new=$3
# that's a literal tab, because (ba)sh turns \t into t, not a tab
# make sure your editor doesn't expand it to spaces
git diff --name-only $old $new | egrep '(\.(cpp|h)$)|^CMakeLists.txt$' | xargs -d'\n' git diff -U0 $old $new -- | grep -q '^+.* ' && exit 1
В нем перечислены все файлы, которые отличаются между старым и новым, greps для всех желаемых, получает diff для них (с нулевыми строками контекста, так как нам все равно) и greps для добавленной строки (начиная с +
), содержащей вкладку.Grep завершается успешно, если находит, что позволяет &&
запустить exit 1
, что приводит к выходу из строя хука и отмене обновления!
Обратите внимание, что это немного отличается от ваших требований - он проверяетесли diff добавляет какие-либо символы табуляции.Это, вероятно, лучше в долгосрочной перспективе;как только вы убедились, что с вашим существующим кодом все в порядке, это то же самое, за исключением того, что намного быстрее, так как ему не нужно искать весь контент.