Изменить имя ветки git init по умолчанию

Изменить имя ветки git init по умолчанию

Я пытаюсь выяснить, как использовать 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она инициализирует репозиторий. Затем она проверит, существует ли уже ветка "папочка". Если да, она проверит эту ветку, в противном случае она создаст ветку и переместит вас на нее.

Связанный контент