Как предотвратить коммит в отдельном заголовке
Почему Git позволяет вам совершать отстраненную голову? Есть ли какой-нибудь хук предварительной фиксации, который может отключить его? Какова цель? Многие новые разработчики делают это, и я хотел бы найти способ отключить его.
3 ответа
Это может быть предотвращено только местным мерзавцем pre-commit
хук, так что разработчикам нужно будет его создать. Добавить your-local-project/.git/hooks/pre-commit
файл со следующим содержимым:
#!/bin/sh
if ! git symbolic-ref HEAD &> /dev/null; then
echo "You are in a detached head state! Commit has been blocked. (Use --no-verify to bypass this check.)"
exit 1
fi
Убедитесь, что это исполняемый файл. Кредиты идут в свачалек
Почему git должен предотвращать коммитирование в отдельном заголовке? Отделенный заголовок означает только то, что нет указателя на состояние репозитория, с которым вы работаете. Это предполагает, что вы знаете, что делаете.
Я бы лучше выяснил, почему многие разработчики в вашей команде входят в это состояние? Может быть, они применяют какой-то странный рабочий поток?
Git использует это внутренне для многих операций. Отключенный режим HEAD просто переводит вас в (одну, единственную, специальную) анонимную ветвь, а анонимной ветке может быть присвоено имя позже.
Это, например, как git rebase
удается скопировать коммиты из их исходной цепочки в новую цепочку. Сначала он проверяет --onto
целевой коммит (--onto
по умолчанию <upstream>
) используя этот режим HEAD. Затем для каждого коммита, который должен быть скопирован, он копирует этот коммит (с git cherry-pick
или что-то эквивалентное: детали варьируются в зависимости от интерактивного или неинтерактивного перебазирования, и, если он интерактивный, гораздо больше деталей). Наконец, он перемещает существующую метку ветки, чтобы она указала на окончательный скопированный коммит.
git checkout $commit-sha1
может привести к обособленной ГОЛОВЕ. Так же git checkout FETCH_HEAD
, Отдельная ГОЛОВА может рассматриваться как ветка без имени. Если вас это не смущает, вы можете просто проигнорировать это. Как сказал @fracz, вы можете предотвратить это, pre-commit
, Вы также можете сделать это веткой с именем с git checkout -b some_name
, post-checkout
Хук может помочь вам обнаружить отсоединенное состояние HEAD и сделать его ответвлением.