Как предотвратить коммит в отдельном заголовке

Почему 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 и сделать его ответвлением.

Другие вопросы по тегам