Я пытаюсь выяснить, как использовать git init
другое имя ветки по умолчанию, отличное от master
имени первого коммита, но не могу найти конфигурацию git для этого или что-либо еще, что позволило бы мне это сделать (например, псевдонимы работают только для команд, а не для имен веток).
Есть ли способ изменить имя первой ветки, которая git init
настраивается по умолчанию?
решение1
Начиная с версии Git 2.28 (выпущенной 27 июля 2020 г.), вытеперь можно настроить имя ветки, создаваемой при инициализации нового репозитория:
$ git config --global init.defaultBranch main
После установки этой переменной запуск git init
создаст репозиторий, начальная ветка которого будет иметь вид main
:
$ git init
Initialised empty Git repository in /home/thomas/test-git-repo/.git/
$ git status
On branch main
No commits yet
nothing to commit (create/copy files and use "git add" to track)
Примечания к выпуску:https://lore.kernel.org/git/[email protected]/
решение2
В версиях Git до 2.28 HEAD
этожестко закодированоуказать на refs/heads/master
.
if (create_symref("HEAD", "refs/heads/master", NULL) < 0)
Таким образом, нет никаких настроек конфигурации или опций, которые можно было бы git init
изменить на что-то другое.
ЧтоявляетсяОднако возможно изменить то, что HEAD
указывает на точку сразу после git init
с помощьюgit symbolic-ref
:
$ git init
$ git symbolic-ref HEAD refs/heads/test
Это изменится HEAD
, чтобы указать на (еще не существующую) ветку с именем test
. Затем, когда вы создадите свой первый коммит, ветка будет называться test
вместо master
.
решение3
Простой способ изменить HEAD по умолчанию — создать HEAD в каталоге шаблонов git. Сначала настройте каталог шаблонов на ~/Templates/git.git
(или как вам больше нравится):
$ git config --global init.templateDir '~/Templates/git.git'
$ cp -r /usr/share/git-core/templates ~/Templates/git.git
Затем создайте файл HEAD
в каталоге шаблона:
$ echo 'ref: refs/heads/default' > ~/Templates/git.git/HEAD
И все готово! git init
Теперь при каждом запуске вы будете получать сообщение:
$ git init
Reinitialized existing Git repository in [...]
По какой-то причине git решает, использовать ли это сообщение, основываясь на наличии файла HEAD
в .git
, а не на том, .git
нужно ли его создавать. Однако на самом деле неважно, какое сообщение он вам покажет. Из страницы руководства git-init:
Запуск
git init
в существующем репозитории безопасен. Он не перезапишет то, что уже есть. Основная причина повторного запускаgit init
— это выбор недавно добавленных шаблонов (или перемещение репозитория в другое место, если--separate-git-dir
указано).
То есть, git init
гарантированно не перезапишет то, что HEAD
вы вставили в шаблон, и не будет использовать шаблоны HEAD
для перезаписи существующего HEAD
. Поскольку это явно документировано, вы можете на это положиться.
Кроме того, там также говорится:
Файлы и каталоги в каталоге шаблона, имена которых не начинаются с точки, будут скопированы в
$GIT_DIR
после его создания.
Это означает, что вы также можете быть уверены в том, что шаблон будет скопирован сразу после создания .git
, а не в более поздний момент.
(Разумеется, это моя личная интерпретация руководства. Вполне возможно, что разработчики git не согласятся.)
решение4
Как уже упоминалось, HEAD жестко закодирован для указания на master. Однако вы можете создать псевдоним оболочки, чтобы делать git init
то, что вам нравится. Если вы используете bash в качестве оболочки, поместите что-то вроде этого в ваш .bashrc:
function git_init_fnc () {
default_branch="main"
if [[ $1 == "init" ]] && [[ $# -eq 1 ]];then
git init
if [[ ! -z $(git branch -a | grep $default_branch) ]]; then
git checkout "$default_branch"
else
git checkout -b "$default_branch"
fi
else
/usr/bin/git "$@"
fi
}
alias "git"=git_init_fnc
Это заменит команду git
функцией. Эта функция заставит команду git
работать точно так же, если только вы не вызываете ее git init
без других аргументов. При вызове git init
она инициализирует репозиторий. Затем она проверит, существует ли уже ветка "папочка". Если да, она проверит эту ветку, в противном случае она создаст ветку и переместит вас на нее.