Estou tentando descobrir como usar git init
um nome de branch padrão diferente master
do 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 init
configurada?
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 init
produzirá 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 init
alterá-la para outra coisa.
O queépossível, porém, é mudar o que HEAD
aponta logo depois git init
com a ajuda degit symbolic-ref
:
$ git init
$ git symbolic-ref HEAD refs/heads/test
Isso mudará HEAD
para apontar para uma ramificação (ainda não existente) chamada test
. Então, quando você criar seu primeiro commit, o branch será chamado test
em 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 HEAD
no 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 HEAD
arquivo em .git
, em vez de depender se .git
deve 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 init
em um repositório existente é segura. Não substituirá coisas que já existem. O principal motivo para executar novamentegit init
é pegar modelos recém-adicionados (ou mover o repositório para outro local, se--separate-git-dir
for fornecido).
Ou seja, git init
é garantido que não substituirá o HEAD
que você colocou no modelo e também não usará o modelo HEAD
para 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_DIR
depois 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 init
o 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 git
por uma função. Esta função fará com que o comando seja git
executado exatamente da mesma forma, a menos que você esteja chamando git init
sem quaisquer outros argumentos. Quando você ligar, git init
ele 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.