Как я могу создать репозиторий Git с именем ветки по умолчанию, отличным от «master»?

103

В книге Pro Git сказано

«Происхождение» не особенное

Точно так же, как имя ветки «master» не имеет особого значения в Git, как и «origin». В то время как «master» является именем по умолчанию для начальной ветки при запуске git init, что является единственной причиной его широкого использования , «origin» - это имя по умолчанию для удаленного устройства при запуске git clone. Если вместо этого вы запустите git clone -o booyah, тогда у вас будет booyah / master в качестве удаленной ветки по умолчанию.

Это означает, что мы можем использовать имя нашей ветки по умолчанию как main или main-branch или что-то в этом роде. Я не видел ни одной опции, man git-initкоторая инициализирует меня repoс другим именем ветки по умолчанию.

GitHub показывает, как установить имя ветки по умолчанию на странице настроек. Но я не говорю о том, как установить его на каком-то конкретном хостинге Git . Я строго спрашиваю только в отношении Git, а не в отношении какого-либо конкретного хостинга Git .

Есть способ сделать это?

Abhisek
источник
1
Была начата некоторая работа по рассмотрению наименования ветки main / default в github.com/git-for-windows/git/issues/2674 .
Филип Окли

Ответы:

106

Более новый Git, новое репо

Начиная с версии git 2.28.0, git initкоманда теперь принимает --initial-branch(или -bдля краткости) параметр. Эти две команды создают новое репозиторий Git с веткой под названием «trunk», что всегда имело для меня больше смысла, чем «master» (мастер чего?):

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

Это можно настроить с помощью init.defaultBranchпараметра. Если я хочу, чтобы все новые репозитории имели ветку по умолчанию "trunk":

git config --global init.defaultBranch trunk

Старый Git, новое репо

В некоторых системах все еще используются более старые установки Git. Мой сервер Debian 10 (Buster, текущая стабильная версия по состоянию на октябрь 2020 года) поставляется с Git 2.20, который не поддерживает эту -bопцию. Один из вариантов - создать репозиторий, а затем изменить имя ветки. Этот метод работает для обычных (не голых) репозиториев:

git init
git checkout -b trunk

Это создает новый репозиторий с trunkтекущей веткой вместо master. Ветвь на masterсамом деле не существует - ветки не создаются, пока в них не будет хотя бы одного коммита. Пока ветка не будет создана, ветка существует только в .git/HEAD, что объясняет, почему masterветка исчезнет, ​​когда вы переключитесь на trunk.

Голые репо

Для голых репозиториев вы не можете работать git checkout(вот что значит быть голым). Вместо этого вы можете изменить HEAD, чтобы он указывал на другую ветку:

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

Старые репо

Если вы уже сделали это, вы можете запустить git branch -mвместо этого:

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

Это переименовывает ветку из masterв, trunkкогда она была создана.

Это действительно кажется немного неуклюжим, поскольку механизм различается в зависимости от того, пуст ли репозиторий, но он работает. Вы также можете подойти к этому как «создание новой ветки и удаление master».

Дитрих Эпп
источник
В первом случае при беге git checkout -b trunk. Означает ли это, что с этого момента ветвью по умолчанию будет ствол?
Abhisek
2
«По умолчанию» - это немного неправильное название. «Текущая ветка» - это действительно то, что здесь происходит.
Дитрих Эпп
help.github.com/articles/setting-the-default-branch говорит о ветке по умолчанию, поэтому я немного запутался. Я немного поэкспериментировал с тем, что вы сказали. Оказывается, в git нет ничего лучше "Default". спасибо
Abhisek
4
Это похоже на концепцию GitHub, а не на концепцию Git. Здесь говорится о запросах на перенос, а в Git нет такого понятия, как «запрос на перенос».
Дитрих Эпп
Я просто искал что-то вроде этого
Wexoni
92

Вы можете косвенно настроить git initиспользование другой ветки по умолчанию: текущая ветвь определяется HEAD, что является «просто» текстовым файлом, сообщающим Git, какая ссылка является текущей.

Используя init.templateDir, вы можете попросить git initиспользовать другой:

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

и ~/.config/git/template/HEADвведите одну строку (+ разрыв строки): ref: refs/heads/main(по умолчанию для ветки main).

Все содержимое templateDirкопируется в .gitкаталог при создании репозитория; default (здесь /usr/share/git-core/templates) содержит несколько примеров хуков и других файлов, но вы можете использовать свой новый каталог шаблонов, например, для установки хуков по умолчанию.

$ 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
нику
источник
К вашему сведению, если вы следуете этим инструкциям в OSX, вам, возможно, придется поискать файлы шаблонов в / usr / local / git / share / git-core / templates
Брайан Градин,
1
NB: Вы также можете создать HEADфайл в шаблоне по умолчанию, хотя он сообщит вам, что вы «повторно инициализируете» репозиторий, когда вы его фактически создаете.
jhpratt
24

Как я могу создать репозиторий Git с именем ветки по умолчанию, отличным от " master"?

Вы бы использовали Git 2.28 (3 квартал 2020 г.): имя основной ветки в существующих репозиториях и имя по умолчанию, используемое для первой ветки во вновь созданных репозиториях, можно настраивать, чтобы мы могли в конечном итоге отказаться от жестко запрограммированного ' master'.

И напоминание от августа 2020 года с GitHub :

1 октября 2020 г., если вы не изменили ветку по умолчанию для новых репозиториев для вашего пользователя, организации или предприятия, она автоматически изменится с masterнаmain .
Вы можете отказаться от этого изменения в любое время:

  • Для пользователей на странице https://github.com/settings/repositories.
  • Для владельцев организаций на https://github.com/organizations/YOUR-ORGANIZATION/settings/repository-defaultsстранице
  • Для администраторов предприятия на https://github.com/enterprises/YOUR-ENTERPRISE/settings/member_privilegesстранице

Это изменение - одно из многих изменений, которые GitHub вносит для поддержки проектов и разработчиков, которые хотят переименовать свою ветку по умолчанию.
Чтобы узнать больше об изменениях, которые мы вносим, ​​см. Github / renaming .

Но вернемся к самому Git: (2.28, 3 квартал 2020 г.) См. Commit 508fd8e (29 июня 2020 г.) byoàn Trần Công Danh ( sgn) .
См. Фиксацию 0068f21 , фиксацию a471214 , фиксацию 0cc1b47 , фиксацию 32ba12d , фиксацию 6069ecc , commit f0a96e8 , commit 4d04658 (24 Jun 2020), and commit 489947c (23 Jun 2020) by Johannes Schindelin ( dscho) .
См. Commit 8747ebb (24 июня 2020 г.) Дон Гудман-Уилсон ( DEGoodmanWilson) .
(Слияние Junio ​​C Hamano - gitster- incommit 11cbda2 , 06 июл 2020)

init: позволяет указать начальное имя ветки для нового репозитория

Подписано: Йоханнес Шинделин

Растет число проектов и компаний, желающих изменить название основной ветки своих репозиториев (см., Например , твит Мислава Марохнича, чтобы узнать об этом подробнее ).

Чтобы изменить это имя ветки для новых репозиториев, в настоящее время единственный способ сделать это автоматически - это скопировать весь каталог шаблонов Git, затем жестко указать желаемое имя ветки по умолчанию в .git/HEADфайл, а затем настроить init.templateDirуказание на эти скопированные файлы шаблонов.

Чтобы сделать этот процесс гораздо менее громоздким, давайте ввести новый вариант: --initial-branch=<branch-name>.

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

И:

init: разрешить установку значения по умолчанию для начального имени ветки через конфигурацию

Помощник: Йоханнес Шинделин.
Помощник: Деррик Столи.
Подпись: Дон Гудман-Уилсон.

Мы только что ввели параметр командной строки, --initial-branch=<branch-name>позволяющий инициализировать новый репозиторий с начальной ветвью, отличной от жестко запрограммированной.

Чтобы позволить пользователям переопределить исходное имя ветки более постоянно (т.е. без необходимости указывать имя вручную для каждого git initвызова), давайте представим init.defaultBranchнастройку конфигурации.

Примечание: commit 489947c о сообщении о фиксации слияния с тех пор был отменен в Git 2.29, см. " Как я могу настроить сообщение git о фиксации слияния? ». Установка остается.
init.defaultBranch


Это влияет на подмодули:

submodule: возврат к HEAD пульта при отсутствии пульта ... ветвь

Помощник: Филипп Блейн
Подпись: Йоханнес Шинделин.

Если remote.<name>.branchне настроено, в git submodule updateнастоящее время возвращается к использованию имени ветки master.
Однако гораздо лучшая идея - использовать пультHEAD : на всех серверах Git, на которых запущены достаточно свежие версии Git, symref HEADуказывает на основную ветку.

Примечание: t7419 демонстрирует, что могут быть варианты использования, которые ожидают git submodule update --remote обновления подмодулей для удаленной masterветки, даже если удаленный HEADуказывает на другую ветку.
Возможно, этот патч делает поведение более интуитивным, но есть небольшая вероятность того, что это может вызвать регрессию в неясных настройках.

Тем не менее, это поведение можно исправить без какого-либо более длительного переходного периода:

  • В git submodule update --remote не совсем обычная.
  • Поведение Current Git и при выполнении этой команды прямо в заблуждение, если текущая ветвь удаленного репозитория не является master (в этом случае предлагаемое поведение соответствует старому поведению).
  • Если пользователь сталкивается с регрессом из-за измененного поведения, исправление на самом деле тривиально: установка submodule.<name>.branchна masterвосстановит старое поведение.

Обратите внимание, что с Git 2.29 (Q4 2020) тесты в contrib/ скорректированы с учетом недавнего изменения в fmt-merge-msg.

См. Commit b87528c (3 августа 2020 г.) Эмили Шаффер ( nasamuffin) .
(Объединено Junio ​​C Hamano - gitster- в коммите 83b8250 , 10 августа 2020 г.)

Revert "contrib:: subtreeнастроить тест на изменение fmt-merge-msg"

Подписано: Эмили Шаффер

Это отменяет фиксацию 508fd8e8baf3e18ee40b2cf0b8899188a8506d07 .

В 6e6029a8 ( fmt-merge-msg: разрешить снова опустить назначение слияния) мы возвращаем поведение, при котором слияния с " master" по умолчанию не включают " into 'master'" в конце сообщения о слиянии. Это тестовое исправление больше не требуется.

Также:

В Git 2.29 (4 квартал 2020 г.) обновите тесты, чтобы исключить masterиз них слово " ".

См. Commit f33f2d3 , commit b6211b8 (26 сентября 2020 г.) и commit 432f5e6 , commit 5a0c32b , commit 659288c (21 сентября 2020 г.) Йоханнес Шинделин ( dscho) .
(Объединено Junio ​​C Hamano - gitster- в коммите 58138d3 , 5 октября 2020 г.)

tests: избегать вариаций masterназвания ветки

Подписано: Йоханнес Шинделин

У этого термина masterбогатая история, которая служит постоянным напоминанием о расовой несправедливости. У проекта Git нет желания увековечивать это, и он уже начал избегать этого.

Набор тестов использует варианты этого имени для веток, отличных от используемой по умолчанию. Помимо t3200, где мы только что рассмотрели это в предыдущем коммите, эти экземпляры могут быть переименованы автоматически, потому что они не требуют никаких изменений вне тестового сценария, поэтому давайте сделаем это.

Увидев, что затронутые ветки имеют очень мало (если вообще что-либо) общего с ветвью по умолчанию, мы решили использовать полностью отдельную схему именования: topic_<number>(этого не может быть, topic-<number>потому что t5515 использует test_oidмеханизм с этим термином, а этот механизм использует переменные оболочки внутри, имена которых не могут содержать тире).

Этот трюк был выполнен с помощью вызова sed (GNU):

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

И все еще с Git 2.29:

См. Commit 538228e , commit a15ad5d (8 октября 2020 г.) Йоханнес Шинделин ( dscho) .
(Объединено Junio ​​C Hamano - gitster- в коммите 62564ba , 8 октября 2020 г.)

t1415: избегать использования в mainкачестве имени ссылки

Подписано: Йоханнес Шинделин

В рамках подготовки к серии патчей, которые изменят откат для init.defaultBranchна main, давайте не будем использовать mainимя ссылки в этом тестовом сценарии.

В противном случае ( мужчина ), который хочет поймать этих рефери, тоже неожиданно поймает .git for-each-ref ... | grep mainrefs/heads/main

Поскольку рассматриваемые ссылки являются локальными для рабочего дерева (т.е. у каждого рабочего дерева есть свое собственное, точно так же HEAD), и поскольку тестовый пример уже использует вторичное рабочее дерево с именем " second", давайте использовать имя "first вместо этого " для этих ссылок.

При этом настройте заголовки тестов, которые говорят о «репо», когда вместо этого они означают «рабочее дерево».

VonC
источник
18

Начиная с Git 2.28 (выпущенного 27 июля 2020 г.), вводится новый параметр конфигурации init.defaultBranchдля замены жестко заданного терминаmaster .

По умолчанию остается master !

Пользователь может изменить значение переменной конфигурации по умолчанию с помощью:

$ git config --global init.defaultBranch main

Прочтите главу git doc для получения дополнительных сведений Введение в init.defaultBranch

нулевой ход
источник
Да, это то, что я написал в своем ответе на той же странице. stackoverflow.com/a/62983443/6309
VonC
И это то, что я написал, имея в виду тот же ответ: twitter.com/VonC_/status/1284968817010016268
VonC