¿Cómo puedo crear un repositorio de Git con el nombre de rama predeterminado que no sea "maestro"?

85

En el libro Pro Git , dice

"Origen" no es especial

Al igual que el nombre de la rama "maestro" no tiene ningún significado especial en Git, tampoco lo tiene "origen". Si bien "master" es el nombre predeterminado para una rama inicial cuando ejecuta git init, que es la única razón por la que se usa ampliamente , "origin" es el nombre predeterminado para un control remoto cuando ejecuta git clone. Si ejecuta git clone -o booyah en su lugar, entonces tendrá booyah / master como su rama remota predeterminada.

Eso significa que podemos usar nuestro nombre de rama predeterminado como principal o rama principal o algo así. No vi ninguna opción en la man git-initque inicializaría mi repocon un nombre de rama predeterminado diferente.

GitHub muestra cómo establecer el nombre de la rama predeterminado en su página de configuración. Pero no estoy hablando de cómo configurarlo en ningún sitio de alojamiento Git específico . Estoy preguntando estrictamente solo en términos de Git, no en lo que respecta a ningún sitio de alojamiento de Git específico .

¿Hay una manera de hacer eso?

Abhisek
fuente
1
Se ha comenzado a trabajar para buscar el nombre de la rama principal / predeterminada en github.com/git-for-windows/git/issues/2674 .
Philip Oakley

Respuestas:

79

Git más reciente, nuevo repositorio

Desde git versión 2.28.0, el git initcomando ahora toma un parámetro --initial-branch(o -bpara abreviar). Estos dos comandos crean un nuevo repositorio de Git con una rama llamada "tronco", que siempre tuvo más sentido para mí que "maestro" (¿maestro de qué?):

git init --initial-branch=trunk
git init -b trunk

Esto se puede configurar con el init.defaultBranchajuste. Si quiero que todos los repositorios nuevos tengan "troncal" como rama predeterminada:

git config --global init.defaultBranch trunk

Git más antiguo, nuevo repositorio

Algunos sistemas aún tienen instalaciones de Git más antiguas. Mi servidor Debian 10 (Buster, la versión estable actual de octubre de 2020) viene con Git 2.20, que no admite la -bopción. Una opción es crear el repositorio y luego cambiar el nombre de la rama. Esta técnica funciona para repositorios normales (no desnudos):

git init
git checkout -b trunk

Esto crea un nuevo repositorio con trunkla rama actual en lugar de master. La rama masterno existe en realidad; las ramas no se crean hasta que tienen al menos una confirmación. Hasta que se crea la rama, la rama solo existe en .git/HEAD, lo que explica por qué la masterrama desaparecerá cuando cambie a trunk.

Bare Repos

Para repositorios desnudos, no se puede ejecutar git checkout(eso es lo que significa estar desnudo). En su lugar, puede cambiar HEAD para que apunte a una rama diferente:

git init --bare
git symbolic-ref HEAD refs/heads/trunk

Reposiciones antiguas

Si ya te has comprometido, puedes ejecutar en su git branch -mlugar:

git init
touch file.txt
git add file.txt
git commit -m 'commit 1'
git branch -m trunk

Esto cambia el nombre de la rama de mastera trunkuna vez creada.

Esto parece un poco torpe ya que el mecanismo es diferente dependiendo de si el repositorio está vacío, pero funciona. También puede abordarlo como "crear una nueva rama y eliminar master".

Dietrich Epp
fuente
En el primer caso cuando corres git checkout -b trunk. ¿Eso significa que a partir de ese momento la rama predeterminada es troncal?
Abhisek
2
"Predeterminado" es un nombre poco apropiado. "Rama actual" es realmente lo que está pasando aquí.
Dietrich Epp
help.github.com/articles/setting-the-default-branch habla sobre la rama predeterminada, así que me confundí un poco. Hice un pequeño experimento de lo que dijiste. resulta que no hay nada como "Predeterminado" en git. gracias
Abhisek
4
Parece un concepto de GitHub, no un concepto de Git. Habla de solicitudes de extracción, y en Git no existe una "solicitud de extracción".
Dietrich Epp
Solo estaba buscando algo como esto
Wexoni
91

Puede, indirectamente, configurar git initpara usar una rama predeterminada diferente: la rama actual está definida por HEAD, que es "solo" un archivo de texto que le dice a Git cuál es la referencia actual.

Usando init.templateDir, puede solicitar git initusar uno diferente:

# ~/.config/git/config or ~/.gitconfig
[init]
    templateDir = ~/.config/git/template/

y en ~/.config/git/template/HEAD, ponga una sola línea (+ linebreak): ref: refs/heads/main(por defecto a la rama main).

Todo el contenido de templateDirse copia en el .gitdirectorio al crear un repositorio; el predeterminado (aquí /usr/share/git-core/templates) contiene algunos enlaces de muestra y otros archivos, pero puede usar su nuevo directorio de plantillas para configurar los enlaces predeterminados, por ejemplo.

$ tree /usr/share/git-core/templates
/usr/share/git-core/templates
├── branches
├── description
├── hooks
│   ├── applypatch-msg.sample
│   ├── commit-msg.sample
│   ├── fsmonitor-watchman.sample
│   ├── post-update.sample
│   ├── pre-applypatch.sample
│   ├── pre-commit.sample
│   ├── prepare-commit-msg.sample
│   ├── pre-push.sample
│   ├── pre-rebase.sample
│   ├── pre-receive.sample
│   └── update.sample
└── info
    └── exclude

3 directories, 13 files
nicoo
fuente
Para su información, para cualquiera que siga estas instrucciones en OSX, es posible que deba buscar en / usr / local / git / share / git-core / templates los archivos de plantilla
Brian Gradin
1
NB: También puede crear un HEADarchivo en la plantilla predeterminada, aunque le dirá que está "reinicializando" un repositorio cuando en realidad esté creando uno.
jhpratt
24

¿Cómo puedo crear un repositorio de Git con el nombre de rama predeterminado que no sea " master"?

Usaría Git 2.28 (tercer trimestre de 2020): el nombre de la rama principal en los repositorios existentes, y el nombre predeterminado utilizado para la primera rama en los repositorios recién creados, se hace configurable, de modo que eventualmente podamos dejar de usar el código 'hardcode' master'.

Y recordatorio de agosto de 2020 de GitHub :

El 1 de octubre de 2020, si no ha cambiado la rama predeterminada para nuevos repositorios para su usuario, organización o empresa, cambiará automáticamente de masteramain .
Puede optar por no participar en este cambio en cualquier momento:

  • Para los usuarios, en la página https://github.com/settings/repositories
  • Para propietarios de organizaciones, en la https://github.com/organizations/YOUR-ORGANIZATION/settings/repository-defaultspágina
  • Para administradores de empresas, en la https://github.com/enterprises/YOUR-ENTERPRISE/settings/member_privilegespágina

Este cambio es uno de los muchos cambios que GitHub está haciendo para respaldar proyectos y mantenedores que desean cambiar el nombre de su rama predeterminada.
Para obtener más información sobre los cambios que estamos realizando, consulte github / renaming .

Pero volvamos al propio Git: (2.28, tercer trimestre de 2020) Ver el compromiso 508fd8e (29 de junio de 2020) de Đoàn Trần Công Danh ( sgn) .
Consulte la confirmación 0068f21 , la confirmación a471214 , la confirmación 0cc1b47 , la confirmación 32ba12d , la confirmación 6069ecc , la confirmación f0a96e8 , la confirmación 4d04658 (24 de junio de 2020) y la confirmación 489947c (23 de junio de 2020) por Johannes Schindelin ( dscho) .
Consulte la confirmación 8747ebb (24 de junio de 2020) de Don Goodman-Wilson ( DEGoodmanWilson) .
(Fusionada por Junio ​​C Hamano - gitster- encommit 11cbda2 , 06 de julio de 2020)

init: permite especificar el nombre de la rama inicial para el nuevo repositorio

Firmado por: Johannes Schindelin

Hay un número creciente de proyectos y empresas que desean cambiar el nombre de la sucursal principal de sus repositorios (consulte, por ejemplo, el tweet de Mislav Marohnić para conocer los antecedentes al respecto).

Para cambiar ese nombre de rama para nuevos repositorios, actualmente la única forma de hacerlo automáticamente es copiando todo el directorio de plantillas de Git, luego codificando el nombre de rama predeterminado deseado en el .git/HEADarchivo y luego configurándolo init.templateDirpara apuntar a esos archivos de plantilla copiados.

Para hacer este proceso mucho menos engorroso, vamos a introducir una nueva opción: --initial-branch=<branch-name>.

git init --initial-branch=hello myLocalRepo
# or
git config --global init.defaultBranch hello
git init myLocalRepo

Y:

init: permite configurar el nombre predeterminado de la rama inicial a través de la configuración

Ayudado por: Johannes Schindelin
Ayudado por: Derrick Stolee
Firmado por: Don Goodman-Wilson

Acabamos de introducir la opción de línea de comandos --initial-branch=<branch-name>para permitir la inicialización de un nuevo repositorio con una rama inicial diferente a la codificada.

Para permitir a los usuarios anular el nombre de la rama inicial de forma más permanente (es decir, sin tener que especificar el nombre manualmente para todas y cada una de las git initinvocaciones), introduzcamos la init.defaultBranchconfiguración de configuración.

Nota: la confirmación 489947c , sobre el mensaje de confirmación de fusión, se ha revertido desde entonces en Git 2.29, consulte " ¿Cómo puedo personalizar el mensaje de confirmación de fusión de git? ".
El init.defaultBranchescenario permanece.


Esto afecta a los submódulos:

submodule: recurrir a HEAD del control remoto por falta de control remoto.

Ayudado por: Philippe Blain
Firmado por: Johannes Schindelin

Cuando remote.<name>.branchno está configurado, git submodule updateactualmente vuelve a usar el nombre de la rama master.
Sin embargo, una idea mucho mejor es usar el control remoto HEAD: en todos los servidores Git que ejecutan versiones de Git razonablemente recientes, el symref HEADapunta a la rama principal.

Nota: t7419 demuestra que puede haber casos de uso que esperan git submodule update --remote actualizar submódulos a la masterrama remota incluso si el remoto HEADapunta a otra rama.
Podría decirse que este parche hace que el comportamiento sea más intuitivo, pero existe una pequeña posibilidad de que esto provoque regresiones en configuraciones poco claras.

Aun así, debería estar bien corregir este comportamiento sin nada como un período de transición más largo:

  • El git submodule update --remotecomando no es realmente común.
  • El comportamiento actual de Git al ejecutar este comando es completamente confuso, a menos que la rama actual del repositorio remoto lo sea master (en cuyo caso el comportamiento propuesto coincide con el comportamiento anterior).
  • Si un usuario encuentra una regresión debido al comportamiento cambiado, la solución es en realidad trivial: la configuración submodule.<name>.branchen masterrestablecerá el comportamiento anterior.

Tenga en cuenta que, con Git 2.29 (Q4 2020), las pruebas contrib/se ajustan al cambio reciente a fmt-merge-msg.

Consulte la confirmación b87528c (3 de agosto de 2020) de Emily Shaffer ( nasamuffin) .
(Combinado por Junio ​​C Hamano - gitster- en el compromiso 83b8250 , 10 de agosto de 2020)

Revert "contrib:: subtreeajuste la prueba para cambiar en fmt-merge-msg"

Firmado por: Emily Shaffer

Esto revierte el compromiso 508fd8e8baf3e18ee40b2cf0b8899188a8506d07 .

En 6e6029a8 ( fmt-merge-msg: permitir que el destino de la fusión se omita de nuevo) recuperamos el comportamiento donde se fusiona con ' master', por defecto, no incluimos " into 'master'" al final del mensaje de fusión. Esta corrección de prueba ya no es necesaria.

También:

Con Git 2.29 (Q4 2020), actualice las pruebas para eliminar la palabra ' master' de ellas.

Consulte la confirmación f33f2d3 , la confirmación b6211b8 (26 de septiembre de 2020) y la confirmación 432f5e6 , la confirmación 5a0c32b , la confirmación 659288c (21 de septiembre de 2020) de Johannes Schindelin ( dscho) .
(Combinado por Junio ​​C Hamano - gitster- en el compromiso 58138d3 , 05 de octubre de 2020)

tests: evitar variaciones del masternombre de la rama

Firmado por: Johannes Schindelin

El término mastertiene una historia cargada que sirve como un recordatorio constante de la injusticia racial. El proyecto Git no tiene ningún deseo de perpetuar esto y ya comenzó a evitarlo.

El conjunto de pruebas usa variaciones de este nombre para ramas distintas de la predeterminada. Aparte de t3200, donde acabamos de abordar esto en la confirmación anterior, esas instancias se pueden renombrar de manera automatizada porque no requieren ningún cambio fuera del script de prueba, así que hagámoslo.

Dado que las ramas tocadas tienen muy poco (si es que tienen algo) que ver con la rama predeterminada, elegimos usar un esquema de nomenclatura completamente separado: topic_<number>(no puede ser topic-<number>porque t5515 usa la test_oidmaquinaria con el término y esa maquinaria usa variables de shell internamente cuyos nombres no pueden contener guiones).

Este truco fue realizado por esta invocación sed (GNU):

$ sed -i 's/master\([a-z0-9]\)/topic_\1/g' t/t*.sh

Y, todavía con Git 2.29:

Consulte la confirmación 538228e , la confirmación a15ad5d (08 de octubre de 2020) de Johannes Schindelin ( dscho) .
(Combinado por Junio ​​C Hamano - gitster- en el compromiso 62564ba , 08 de octubre de 2020)

t1415: evite usar maincomo nombre de referencia

Firmado por: Johannes Schindelin

En preparación para una serie de parches que cambiará la alternativa init.defaultBrancha main, no usemos maincomo nombre de referencia en este script de prueba.

De lo contrario, el ( hombre ) que quiere atrapar a esos árbitros también atraparía inesperadamente .git for-each-ref ... | grep mainrefs/heads/main

Dado que las referencias en cuestión son locales de árbol de trabajo (es decir, cada árbol de trabajo tiene las suyas propias, como HEAD), y dado que el caso de prueba ya usa un árbol de trabajo secundario llamado " second", usemos el nombre " first" para esas referencias.

Mientras lo hace, ajuste los títulos de prueba que hablan de un "repositorio" cuando se referían a un "árbol de trabajo".

VonC
fuente
15

Desde Git 2.28 (lanzado el 27 de julio de 2020), init.defaultBranchse está introduciendo una nueva opción de configuración para reemplazar el término codificado master.

El valor predeterminado sigue siendo master!

El usuario puede anular el valor predeterminado de la variable de configuración con:

$ git config --global init.defaultBranch main

Lea el capítulo de git doc para obtener más detalles. Introducción a init.defaultBranch

zerocewl
fuente
Sí, eso es lo que he escrito en mi respuesta en esa misma página. stackoverflow.com/a/62983443/6309
VonC
Y eso es lo que twitteé, refiriéndome a la misma respuesta: twitter.com/VonC_/status/1284968817010016268
VonC