Alterar o nome do branch padrão do git init

Alterar o nome do branch padrão do git init

Estou tentando descobrir como usar git initum nome de branch padrão diferente masterdo primeiro commit, mas não consigo encontrar uma configuração do git para ele ou qualquer coisa que me permita fazer isso (por exemplo, aliases só funcionam para comandos, não nomes de ramificações).

Existe alguma maneira de alterar o nome padrão da primeira filial git initconfigurada?

Responder1

A partir do Git 2.28 (lançado em 27 de julho de 2020), vocêagora pode configurar o nome do branch criado quando você inicia um novo repositório:

$ git config --global init.defaultBranch main

Depois de definir esta variável, a execução git initproduzirá um repositório cujo branch inicial é 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)

Notas de lançamento:https://lore.kernel.org/git/[e-mail protegido]/

Responder2

Nas versões do Git anteriores a 2.28, HEADécodificadoapontar para refs/heads/master.

if (create_symref("HEAD", "refs/heads/master", NULL) < 0)

Portanto, não há nenhuma configuração ou opção que você possa passar para git initalterá-la para outra coisa.

O queépossível, porém, é mudar o que HEADaponta logo depois git initcom a ajuda degit symbolic-ref:

$ git init
$ git symbolic-ref HEAD refs/heads/test

Isso mudará HEADpara apontar para uma ramificação (ainda não existente) chamada test. Então, quando você criar seu primeiro commit, o branch será chamado testem vez de master.

Responder3

Uma maneira simples de alterar o HEAD padrão é criar um HEAD no diretório do modelo git. Primeiro, configure seu diretório de modelo para ~/Templates/git.git(ou o que você preferir):

$ git config --global init.templateDir '~/Templates/git.git'
$ cp -r /usr/share/git-core/templates ~/Templates/git.git

Em seguida, crie o arquivo HEADno diretório do modelo:

$ echo 'ref: refs/heads/default' > ~/Templates/git.git/HEAD

E você está pronto para ir! Sempre que você executar git init, você receberá a mensagem:

$ git init
Reinitialized existing Git repository in [...]

Por alguma razão, o git decide se deve usar esta mensagem com base na presença do HEADarquivo em .git, em vez de depender se .gitdeve ou não ser criado. No entanto, realmente não importa a mensagem que ele mostra. Na página de manual do git-init:

A execução git initem um repositório existente é segura. Não substituirá coisas que já existem. O principal motivo para executar novamente git inité pegar modelos recém-adicionados (ou mover o repositório para outro local, se --separate-git-dirfor fornecido).

Ou seja, git inité garantido que não substituirá o HEADque você colocou no modelo e também não usará o modelo HEADpara substituir um existente HEAD. Como isso está explicitamente documentado, você pode confiar nisso.

Além disso, também diz:

Arquivos e diretórios no diretório do modelo cujo nome não comece com um ponto serão copiados para $GIT_DIRdepois de serem criados.

O que significa que você também pode contar com a cópia do modelo imediatamente após a criação do .git, e não posteriormente.

(Claro, esta é minha interpretação pessoal do manual. É perfeitamente possível que os desenvolvedores git discordem.)

Responder4

Como mencionado, HEAD é codificado para apontar para o mestre. No entanto, você pode criar um alias de shell para fazer git inito que quiser. Se você estiver usando o bash como shell, coloque algo assim no seu .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

Isso substituirá o comando gitpor uma função. Esta função fará com que o comando seja gitexecutado exatamente da mesma forma, a menos que você esteja chamando git initsem quaisquer outros argumentos. Quando você ligar, git initele iniciará o repositório. Em seguida ele irá verificar se o branch "daddy" já existe. Se isso acontecer, ele fará check-out desse branch, caso contrário, ele criará o branch e o moverá para ele.

informação relacionada