Там нет ничего встроенного (хотя должно быть, без сомнения). Что вы можете сделать, так это предоставить хук перед фиксацией, который проверяет, что все имена в порядке, и предотвращает фиксацию, если нет.
Этот хук нужно запускать только в Linux (хотя заставить его работать на Linux и Mac легко, проблематична только Windows с его бедным набором инструментов по умолчанию). Возможно, вы захотите добавить его в боковую ветку и дать людям Linux инструкции по его настройке.
Вы также можете проверить имена веток, как в git pre-commit или update hook для остановки фиксации с помощью имена веток, имеющие совпадение без учета регистра. (Интересно: ответ на этот вопрос принадлежит мне, я его забыл.)
Во-первых, давайте напишем функцию «проверки на конфликт регистра». Это всего лишь вопрос сортировки с сворачиванием регистра (чтобы «helloworld» и «helloWorld» располагались рядом друг с другом), а затем использование uniq -di
для вывода любых повторяющихся (после сворачивания регистра) строк, но не дубликатов:
sort -f | uniq -di
Если это приводит к каким-либо результатам, это «плохие имена». Давайте зафиксируем вывод во временном файле и проверим его размер, чтобы мы могли распечатать их и в стандартный вывод:
#! /bin/sh
TF=$(mktemp)
trap "rm -f $TF" 0 1 2 3 15
checkstdin() {
sort -f | uniq -di > $TF
test -s $TF || return 0 # if $TF is empty, we are good
echo "non-unique (after case folding) names found!" 1>&2
cat $TF 1>&2
return 1
}
Теперь нам просто нужно использовать его для файлов, которые будут зафиксированы, и, возможно, также для имен веток. Первые перечислены с git ls-files
, поэтому:
git ls-files | checkstdin || {
echo "ERROR - file name collision, stopping commit" 1>&2
exit 1
}
Вы можете придумать, как использовать git diff-index --cached -r --name-only --diff-filter=A HEAD
для проверки только добавленных файлов, позволяя продолжать существующие коллизии case, и/или пытаться проверять вещи во многих ветвях и/или коммитах, но это становится затруднительным.
Объедините два приведенных выше фрагмента в один скрипт (и тест), а затем просто скопируйте его в исполняемый файл с именем .git/hooks/pre-commit
.
Проверка имен веток немного сложнее. Это действительно должно произойти, когда вы создаете имя ветки, а не когда вы фиксируете его, и невозможно действительно хорошо работать на клиенте — это должно быть сделано на централизованном сервере, который имеет надлежащее глобальное представление.
Вот способ сделать это на сервере в сценарии предварительного получения, в сценарии оболочки, а не в Python (как в связанном ответе). Нам по-прежнему нужна функция checkstdin
, и вы можете захотеть сделать это в хуке обновления, а не в хуке предварительного получения, так как вам не нужно отклонять весь push, только одну ветвь имя.
NULLSHA=0000000000000000000000000000000000000000 # 40 0s
# Verify that the given branch name $1 is unique,
# even IF we fold all existing branch names' cases.
# To be used on any proposed branch creation (we won't
# look at existing branches).
check_new_branch_name() {
(echo "$1"; git for-each-ref --format='%(refname:short)' refs/heads) |
checkstdin || {
echo "ERROR: new branch name $1 is not unique after case-folding" 1>&2
exit 1 # or set overall failure status
}
}
while read oldsha newsha refname; do
... any other checks ...
case $oldsha,$refname in
$NULLSHA,refs/heads/*) check_new_branch_name ${refname#refs/heads/};;
esac
... continue with any other checks ...
done
person
torek
schedule
15.12.2016