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


83

Pro Git书中,它说

“起源”并不特殊

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

这意味着,我们可以将默认分支名称用作mainmain-branch或类似名称。我没有看到可以使用其他默认分支名称man git-init初始化我的任何选项repo

GitHub展示了如何在其设置页面中设置默认分支名称。但是我不是在谈论如何在任何特定的Git托管站点上进行设置。我仅在Git方面提出严格要求,而不是在任何特定的Git托管站点方面提出要求。

有没有办法做到这一点?


1
已经开始进行一些工作来查看github.com/git-for-windows/git/issues/2674中main / default分支的命名
菲利普·奥克利

Answers:


77

新Git,新仓库

从git 2.28.0版本开始,该git init命令现在使用一个--initial-branch(或-b简称为)参数。这两个命令用一个名为“ trunk”的分支创建了一个新的Git存储库,这对我来说比“ master”(什么是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年10月为当前稳定版本)随附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。从那时起,默认分支就是Trunk吗?
Abhisek

2
“默认”有点用词不当。“当前分支”实际上就是这里正在发生的事情。
Dietrich Epp's

help.github.com/articles/setting-the-default-branch讨论了默认分支,所以我很少感到困惑。我对你说的话做了一点实验。事实证明,git中没有类似“默认”的东西。谢谢
Abhisek '17

4
看起来像GitHub概念,而不是Git概念。它讨论了拉取请求,在Git中没有“拉取请求”之类的东西。
Dietrich Epp

我只是在寻找这样的东西
Wexoni

91

您可以间接配置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默认为branch 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

仅供参考,对于在OSX上遵循以下说明的任何人,您可能必须在/ usr / local / git / share / git-core / templates中查找模板文件
Brian Gradin

1
注意:您也可以HEAD在默认模板中创建文件,尽管它会告诉您在实际创建存储库时正在“重新初始化”存储库。
jhpratt

24

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

您将使用Git 2.28(2020年第3季度):现有存储库中主分支的名称以及新创建的存储库中第一个分支的默认名称是可配置的,这样我们最终就可以摆脱硬编码的“ master'。

并提醒2020年8月从GitHub

2020年10月1日,如果尚未更改用户,组织或企业的新存储库的默认分支,它将自动从更改mastermain
您可以随时选择退出此更改:

  • 对于用户,请访问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,Q3 2020)见提交508fd8e通过(2020年6月29日)ĐoànTRAN聪DANH( )sgn
请参阅Johannes Schindelin()的提交0068f21提交a471214提交0cc1b47提交32ba12d提交6069ecc提交f0a96e8提交4d04658(2020年6月24日)和489947c(2020年6月23日。 参见Don Goodman-Wilson(提交的8747ebb(2020年6月24日(由Junio C Hamano合并--dscho
DEGoodmanWilson
gitster提交11cbda2,2020年7月6日)

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

签字人:约翰内斯·辛德尔林

越来越多的项目和公司希望更改其存储库的主要分支名称(有关此背景,请参见例如MislavMarohnić的推文)。

要更改新存储库的分支名称,当前唯一自动执行的方法是复制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:允许通过配置为初始分支名称设置默认值

帮助人:Johannes Schindelin
帮助人:Derrick Stolee
签名人:Don Goodman-Wilson

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

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

注意:关于commit提交消息的commit 489947c已在Git 2.29中恢复,请参见“如何自定义git的合并提交消息? ”。
init.defaultBranch设置保持不变。


这会影响子模块:

submodule:由于缺少遥控器而回到遥控器的HEAD。

提出者:Philippe Blain
签署人:Johannes Schindelin

如果remote.<name>.branch没有配置,git submodule update目前回退到使用该分支名称master
但是,一个更好的主意是使用remote HEAD:在运行合理最新Git版本的所有Git服务器上,symrefHEAD指向main分支。

注意:t7419演示了可能存在用例,这些用例期望 git submodule update --remote 将子模块更新到远程master分支,即使远程HEAD指向另一个分支。
可以说,此修补程序使行为更直观,但是极有可能在晦涩的设置中导致性能下降。

即使这样,也可以在没有更长过渡期的情况下解决此问题,这是可以的:

  • git submodule update --remote命令并不是很常见。
  • 运行此命令时,当前Git的行为会造成混乱,除非远程存储库的当前分支 master(在这种情况下,建议的行为与旧行为匹配)。
  • 如果用户由于更改的行为而遇到退步,则此修复实际上是微不足道的:设置submodule.<name>.branchmaster将会恢复旧的行为。

请注意,在Git 2.29(2020年第四季度)中,测试contrib/已根据的最新更改进行了调整fmt-merge-msg

参见Emily Shaffer(提交的b87528c(2020年8月3日(通过合并JUNIOÇ滨野- -提交83b8250 8月10日2020)nasamuffin
gitster

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

签名人:艾米莉·谢弗(Emily Shaffer)

这将还原提交508fd8e8baf3e18ee40b2cf0b8899188a8506d07

6e6029a8fmt-merge-msg:允许省略合并目标再次)我们回去的行为,其中对“合并master”,默认情况下,不包括“ into 'master'”在合并消息的结尾。不再需要此测试修复。

也:

使用Git 2.29(Q4 2020),更新测试以master从其中删除单词' '。

请参阅Johannes Schindelin()的提交f33f2d3提交b6211b8(2020年9月26日)和提交432f5e6提交5a0c32b提交659288c(2020年9月21日(通过合并JUNIOÇ滨野- -提交58138d3,2020年10月5日)dscho
gitster

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

签字人:约翰内斯·辛德尔林

这个词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:

参见Johannes Schindelin(提交的538228e提交a15ad5d(2020年10月8日(通过合并JUNIOÇ滨野- -提交62564ba,2020年10月8日)dscho
gitster

t1415:避免main用作参考名称

签字人:约翰内斯·辛德尔林

在一个贴片系列,这将改变后备准备init.defaultBranchmain,我们也不要使用main作为参考的名字在这个测试脚本。

否则,想要抓住那些裁判的男人也会意外地抓住。git for-each-ref ... | grep mainrefs/heads/main

由于有问题的ref是本地的工作树(例如,每个工作树都有自己的ref HEAD),并且由于测试用例已经使用了名为“ second”的辅助工作树,因此我们将名称“ first”用于这些引用。

同时,调整当它们表示“工作树”时谈论“回购”的测试标题。


14

Git 2.28(于2020年7月27日发布)以来,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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.