如何使用默认分支名称创建Git存储库,而不是“master”?

Pro Git书籍中,它说

“起源”并不特殊

就像分支名称“master”在Git中没有任何特殊含义一样,“origin”也没有任何特殊含义。当你运行git init时,“master”是启动分支的默认名称,这是它被广泛使用的唯一原因, " origin "是运行git clone时远程的默认名称。如果你运行git clone -o booyah,那么你将有booyah/master作为你的默认远程分支。

这意味着,我们可以使用默认的分支名称主要主干或类似的名称。我在man git-init中没有看到任何选项,它将用不同的默认分支名称初始化我的repo

GitHub展示了如何设置默认分支名称的设置页面。但我不是在讨论如何在任何特定的Git托管站点上设置它。我严格地只在Git方面要求,而不是关于任何特定的Git托管站点

有办法做到吗?

139029 次浏览

更新的Git,新的回购

从git 2.28.0版本开始,git init命令现在接受一个--initial-branch(或简称-b)参数。这两个命令创建了一个新的Git repo,它有一个名为“trunk”的分支,对我来说,这个分支总是比“master”更有意义。(掌握什么?)

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

这可以通过init.defaultBranch设置进行配置。如果我想要所有的新回购都有“主干”;作为默认分支:

git config --global init.defaultBranch trunk

旧Git,新Repo

一些系统仍然安装了较旧的Git。我的Debian 10服务器(Buster,截至2020年10月的当前的稳定版本)附带了Git 2.20,它不支持-b选项。一种选择是创建存储库,然后更改分支名称。此技术适用于正常(非裸)回购:

git init
git checkout -b trunk

这将创建一个以trunk而不是master作为当前分支的新存储库。分支master实际上并不存在——直到至少有一次提交,分支才会被创建。在分支创建之前,分支只存在于.git/HEAD中,这解释了为什么当你切换到trunk时,master分支将消失。

裸露的回购

对于裸回购,不能运行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

这似乎有点笨拙,因为机制取决于存储库是否为空,但它是有效的。你也可以将其理解为“创建一个新分支并删除__abc0”。

你可以间接地配置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

如何创建一个默认分支名称而不是“master"”的Git存储库?

你可以使用Git 2.28 (Q3 2020):现有存储库中主分支的名称,以及新创建存储库中第一个分支使用的默认名称,都是可配置的,因此我们最终可以摆脱硬编码的'master'。

2020年8月从GitHub提醒:

< p > 在2020年10月1日,如果您还没有更改用户、组织或企业的新存储库的默认分支,它将自动从__ABC0更改为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) 参见Đoàn trn Công Danh (sgn)提交508年fd8e (29 Jun 2020)。
参见约翰内斯·辛德林(dscho)提交0068年f21提交a471214提交0 cc1b47提交32 ba12d提交6069年ecc提交f0a96e8提交4 d04658(2020年6月24日)和提交489947 c(2020年6月23日)。
参见Don Goodman-Wilson (DEGoodmanWilson)提交8747年衰退(2020年6月24日)。
(由Junio C Hamano—gitster提交11 cbda2中合并,06 Jul 2020)

init:允许为新存储库指定初始分支名称

署名:Johannes Schindelin

有越来越多的项目和公司希望改变其存储库的主分支名称(参见例如Mislav marohnich的推特了解这方面的背景知识)。

要为新的存储库更改分支名称,目前唯一自动做到这一点的方法是复制所有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:允许通过config设置初始分支名称的默认值

< p > 帮助:Johannes Schindelin
资助人:德里克·斯托利
签名:Don Goodman-Wilson

我们刚刚引入了命令行选项--initial-branch=<branch-name>,以允许使用不同于硬编码的初始分支初始化一个新的存储库。

为了允许用户更永久地覆盖初始分支名称(即不必为每次git init调用手动指定名称),让我们引入init.defaultBranch配置设置。

注意:提交489947 c,关于合并提交消息,已经在Git 2.29中恢复,参见&;__abc1 &;。
init.defaultBranch设置保持不变

这会影响子模块:

submodule:回退到遥控器的HEAD,因为缺少遥控器..分支

< p > 资助人:菲利普·布莱恩
署名:Johannes Schindelin

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 Aug 2020) by 艾米丽·谢弗(nasamuffin)
(由Junio C Hamano—gitster in 提交83年b8250合并,10 Aug 2020)

Revert "contrib: subtree:调整测试更改在fmt-merge-msg"

署名:Emily Shaffer

这将还原提交508年fd8e8baf3e18ee40b2cf0b8899188a8506d07

6 e6029a8 (fmt-merge-msg:允许合并目的地再次被省略)中,我们返回对'master'进行合并的行为,默认情况下,不包括&;__abc2 &;在合并消息的末尾。不再需要此测试修复。

另外:

在Git 2.29 (Q4 2020)中,更新测试以删除单词“master”。

参见约翰内斯·辛德林(dscho)中的提交f33f2d3提交b6211b8 (26 Sep 2020)和提交432年f5e6提交5 a0c32b提交659288 c (21 Sep 2020)。
(由Junio C Hamano—gitster in 提交58138 d3合并,05 Oct 2020)

tests:避免master分支名称的变化

署名:Johannes Schindelin

master这个词有着丰富的历史,不断提醒着人们种族不平等。Git项目不希望延续这种情况,并且已经开始避免这种情况。

测试套件将该名称的变体用于除默认名称以外的分支。除了上次提交中提到的t3200之外,可以以自动方式重命名这些实例,因为它们不需要在测试脚本之外进行任何更改,因此让我们这样做。

鉴于被触及的分支与默认分支几乎没有关系(如果有的话),我们选择使用一个完全独立的命名方案:topic_<number>(它不能是topic-<number>,因为t5515使用test_oid机制与术语,并且该机制在内部使用shell变量,其名称不能包含破折号)。

这个技巧是由下面(GNU) sed调用执行的:

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

并且,仍然使用Git 2.29:

参见提交538228 e提交a15ad5d (08 Oct 2020) by 约翰内斯·辛德林(dscho)
(由Junio C Hamano—gitster in 提交62564 ba合并,08 Oct 2020)

t1415:避免使用main作为引用名称

署名:Johannes Schindelin

为了准备将init.defaultBranch的回退更改为main的补丁系列,让我们不要在这个测试脚本中使用main作为ref名称。

否则,想要捕获这些引用的git for-each-ref ... | grep main(man)也会意外地捕获refs/heads/main

由于所讨论的引用是工作树本地引用(即每个工作树都有自己的工作树,就像HEAD),并且由于测试用例已经使用了一个名为“__abc1”的次要工作树,所以让我们使用“__abc2”这个名称。而是给那些裁判。

在此过程中,调整测试标题,谈论一个&;repo&;当他们指的是“工作树”;代替。

由于Git 2.28(发布于2020年7月27日)是一个新的配置选项,init.defaultBranch被引入来取代硬编码的术语master

默认值仍然是master!

用户可以覆盖配置变量的默认值:

$ git config --global init.defaultBranch main

更多细节请阅读git文档章节引入init.defaultBranch

如果你使用Azure Devops:

  1. 在你的项目回购下,选择分支。

  2. 在“分支”页面,选择新建默认分支后的“更多选项”,并选择“设置为默认分支”。

enter image description here

  1. 在您设置了新的默认分支之后,如果您愿意,可以删除之前的默认分支。