Як я можу створити сховище Git із назвою гілки за замовчуванням, відмінною від “master”?


103

У книзі Pro Git сказано

“Походження” не є особливим

Подібно до того, як назва гілки "master" не має особливого значення в Git, як і "походження". Хоча “master” - це ім’я за замовчуванням для початкової гілки під час запуску git init, що є єдиною причиною його широкого використання , “origin” - це ім’я за замовчуванням для віддаленого, коли ви запускаєте git clone. Якщо замість цього ви запустите git clone -o booyah, тоді ви отримаєте booyah / master як віддалену гілку за замовчуванням.

Це означає, що ми можемо використовувати назву нашої гілки за замовчуванням як основну або основну гілку або щось подібне. Я не побачив жодної опції, в man git-initякій би ініціалізувався мій repoз іншим іменем гілки за замовчуванням.

GitHub показує, як встановити назву гілки за замовчуванням на своїй сторінці налаштувань. Але я не кажу про те, як встановити його на будь-якому конкретному веб-сайті хостингу Git . Я суворо питаю лише щодо Git, а не щодо будь-якого конкретного хостинг-сайту Git .

Чи є спосіб зробити це?


1
Деяку роботу розпочато з вивчення іменування основної / стандартної гілки у github.com/git-for-windows/git/issues/2674 .
Філіп Оуклі,

Відповіді:


108

Новіші Git, Нове репо

Починаючи з версії git 2.28.0, git initкоманда тепер приймає --initial-branch(або -bскорочено) параметр. Ці дві команди створюють нове репозиторій Git із гілкою з назвою "trunk", яка для мене завжди мала більше сенсу, ніж "master" (master of what?):

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

Це можна налаштувати з init.defaultBranchналаштуванням. Якщо я хочу, щоб усі нові репозиторії мали "транк" як гілку за замовчуванням:

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. Чи означає це, що з цього моменту гілка за замовчуванням - це транк?
Абхісек,

2
"За замовчуванням" дещо неправильно. "Поточна галузь" - це насправді те, що тут відбувається.
Дітріх Епп,

help.github.com/articles/setting-the-default-branch розповідає про гілку за замовчуванням, тому я трохи не заплутався. Я трохи експериментував із тим, що ви сказали. виявляється, у git немає нічого подібного до "За замовчуванням". подяка
Абхісек

4
Це схоже на концепцію GitHub, а не на концепцію Git. У ньому йдеться про запити на витяг, а в Git немає такого поняття, як "запит на витяг".
Дітріх Епп,

Я просто шукав щось подібне
Вексоні,

92

Ви можете, побічно, налаштувати git initвикористовувати іншу гілку за замовчуванням: поточна гілка визначається HEAD, що є "просто" текстовим файлом, що повідомляє Git, який ref є поточним.

Використовуючи 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каталог під час створення сховища; за замовчуванням (тут /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

FYI для тих, хто дотримується цих інструкцій на OSX, можливо, вам доведеться заглянути в / usr / local / git / share / git-core / шаблони для файлів шаблонів
Брайан Грейдін

1
Примітка. Ви також можете створити HEADфайл у шаблоні за замовчуванням, хоча він повідомлятиме вам, що ви "повторно ініціалізуєте" сховище, коли його фактично створюєте.
jhpratt

24

Як я можу створити сховище Git із назвою гілки за замовчуванням, відмінною від " master"?

Ви скористаєтесь Git 2.28 (Q3 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 / перейменування .

Але повернемось до самого Git: (2.28, Q3 2020) Див. Коміт 508fd8e (29 червня 2020) від Đoàn Trần Công Danh ( sgn) .
Див. Коміт 0068f21 , коміт a471214 , коміт 0cc1b47 , коміт 32ba12d , коміт 6069ecc , коміт f0a96e8 , коміт 4d04658 (24 червня 2020 р.) Та коміт 489947c (23 червня 2020 р.) Від Йоганнеса Шінделіна ( dscho) .
Див. Коміт 8747ebb (24 червня 2020 р.) Дона Гудмана-Вільсона ( DEGoodmanWilson) .
(Об’єднано Хуніо С Хамано - gitster- вкоміт 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налаштування конфігурації.

Примітка: коміт 489947c , про повідомлення коміту злиття, з тих пір було скасовано в Git 2.29, див. " Як я можу налаштувати повідомлення коміту злиття git? ". Установка залишається.
init.defaultBranch


Це впливає на підмодулі:

submodule: повернутися до ГОЛОВКИ пульта дистанційного керування за відсутнім пультом дистанційного відгалуження

Допоміг: Філіпп Блен
Підписав: Йоганнес Шінделін

Якщо remote.<name>.branchне налаштовано, в git submodule updateданий час повертається до використання імені гілки master.
Однак набагато кращою ідеєю є використання пульта дистанційного керування HEAD: на всіх серверах Git, на яких запущені досить останні версії Git, symref HEADвказує на основну гілку.

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

Незважаючи на це, слід виправити цю поведінку, не маючи нічого подібного до довшого перехідного періоду:

  • git submodule update --remoteКоманда не дуже часто.
  • Поточна поведінка Git під час запуску цієї команди відверто заплутує, якщо тільки поточна гілка віддаленого сховища не є master (у цьому випадку запропонована поведінка відповідає старій поведінці).
  • Якщо користувач стикається з регресією через змінену поведінку, виправлення насправді є тривіальним: встановлення submodule.<name>.branchнаmaster відновить стару поведінку.

Зауважимо, що в Git 2.29 (Q4 2020) тести в contrib/налаштовані на нещодавню зміну на fmt-merge-msg.

Див. Коміт b87528c (03 серпня 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 (Q4 2020) оновіть тести, щоб залишити слово 'master з них '.

Див. Коміт f33f2d3 , коміт b6211b8 (26 вересня 2020 р.) Та коміт 432f5e6 , коміт 5a0c32b , коміт 659288c (21 вересня 2020 р.) Йоганнес Шінделін ( dscho) .
(Об’єднано Junio ​​C Hamano - gitster- у комітеті 58138d3 , 05 жовтня 2020)

tests: уникайте варіацій назви masterгілки

Підписав: Йоганнес Шінделін

Цей термін masterмає навантажену історію, яка служить постійним нагадуванням про расову несправедливість. Проект Git не бажає продовжувати це і вже почав уникати цього.

Набір тестів використовує варіанти цього імені для гілок, відмінних від стандартної. Окрім t3200, де ми щойно розглядали це в попередньому коміті, ці екземпляри можна перейменовувати автоматизовано, оскільки вони не вимагають жодних змін поза тестовим сценарієм, тому давайте зробимо це.

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

Цей фокус було виконано за допомогою цього (GNU) виклику:

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

І, як і раніше з Git 2.29:

Див. Коміт 538228e , коміт a15ad5d (08 жовтня 2020 р.) Йоганнеса Шінделіна ( dscho) .
(Об’єднано Junio ​​C Hamano - gitster- у комітеті 62564ba , 08 жовтня 2020)

t1415: уникати використання mainв якості імені ref

Підписав: Йоганнес Шінделін

Готуючись до серії виправлень, яка змінить запас init.defaultBranchна main, давайте не використовуватимемо mainяк ref в цьому тестовому сценарії.

В іншому випадку git for-each-ref ... | grep main ( людина ), яка хоче зловити цих прихильників, також несподівано піймає refs/heads/main.

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

Налаштовуючи тестові заголовки, які говорять про "репо", коли вони мали на увазі "робоче дерево".


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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.