如何使用除master之外的默认分支名称创建git存储库?

Abh*_*sek 13 git version-control

它说,在git-book中

"起源"并不特别

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

也就是说,我们可以用默认的分支名称作为主要分支或类似的东西.我没有看到任何选项man git-initrepo使用不同的默认分支名称初始化我.

Github显示了如何在她的设置页面中设置默认分支名称.但我不是在谈论如何在任何特定的git托管网站中设置它.我只是严格询问git,而不是任何特定的git托管网站.

有没有办法做到这一点 ?

Von*_*onC 26

如何使用“ 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,2020年第三季度)请参阅?oàn Tr?n Công Danh ( sgn) 的commit 508fd8e(2020 年 6 月 29 日
请参阅提交 0068f21提交 a471214提交 0cc1b47提交 32ba12d提交 6069ecc提交 f0a96e8提交 4d04658(2020 年 6 月 24 日)和提交 489947c(2020 年 6 月24 日),提交 489947c (20 Schindel dscho)约翰内斯 2 (20 Schindel )
请参阅Don Goodman-Wilson ( ) 的commit 8747ebb (2020 年 6 月 24 日)(由Junio C Hamano合并-- --DEGoodmanWilson
gitster2020 年 7 月 6 日提交 11cbda2

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

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

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

要更改新存储库的分支名称,目前唯一自动执行此操作的方法是复制 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
Run Code Online (Sandbox Code Playgroud)

和:

init: 允许通过配置设置初始分支名称的默认值

帮助者:Johannes Schindelin
帮助者:Derrick Stolee
签约者:Don Goodman-Wilson

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

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

注意:关于合并提交消息的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指向主分支。

注意:t7419 表明,即使远程指向另一个分支,也可能存在期望 git submodule update --remote 将子模块更新到远程master分支的用例HEAD
可以说,这个补丁使行为更直观,但有一点可能会导致模糊设置中的回归。

即便如此,在没有更长过渡期的情况下修复此行为应该没问题:

  • git submodule update --remote命令并不常见。
  • 运行此命令时当前 Git 的行为完全令人困惑,除非远程存储库的当前分支 master(在这种情况下,提议的行为与旧行为匹配)。
  • 如果用户由于行为改变而遇到回归,修复实际上是微不足道的:设置submodule.<name>.branchmaster将恢复旧行为。

请注意,在 Git 2.29(2020 年第 4 季度)中,contrib/fmt-merge-msg.

请参阅Emily Shaffer ( )提交的 b87528c (2020 年 8 月 3 日)(由Junio C Hamano合并-- --提交 83b8250 中,2020 年 8 月 10 日)nasamuffin
gitster

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

签字人:Emily Shaffer

这将恢复提交 508fd8e8baf3e18ee40b2cf0b8899188a8506d07

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

还:

使用 Git 2.29(2020 年第 4 季度),更新测试以从中删除单词 ' master'。

请参阅Johannes Schindelin ( ) 的commit f33f2d3commit b6211b8(2020 年 9 月 26 日)和commit 432f5e6commit 5a0c32bcommit 659288c(2020 年 9 月 21 日(由Junio C Hamano合并-- --提交 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
Run Code Online (Sandbox Code Playgroud)

而且,仍然使用 Git 2.29:

请参阅Johannes Schindelin ( ) 的commit 538228ecommit a15ad5d(2020 年 10 月 8 日(由Junio C Hamano合并-- --提交 62564ba 中,2020 年 10 月 8 日)dscho
gitster

t1415: 避免main用作参考名称

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

在准备将更改init.defaultBranchto后备的补丁系列时main,我们不要main在此测试脚本中用作 ref 名称。

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

由于有问题的引用是工作树本地的(即每个工作树都有自己的,就像HEAD),并且由于测试用例已经使用了一个名为“ second”的辅助工作树,让我们使用名称“ first”代替这些引用。

在此期间,请调整谈论“repo”的测试标题,而不是“工作树”。


zer*_*ewl 22

Git 2.28(2020 年 7 月 27 日发布)以来,init.defaultBranch引入了一个新的配置选项来替换硬编码术语master.

默认保持为master!

用户可以使用以下命令覆盖配置变量的默认值:

$ git config --global init.defaultBranch main
Run Code Online (Sandbox Code Playgroud)

阅读 git doc 章节以获取更多详细信息Introducing init.defaultBranch


Die*_*Epp 20

正如您所注意到的,git init分支名称没有参数,因此必须执行两个命令.

git init
git checkout -b trunk
Run Code Online (Sandbox Code Playgroud)

这将创建一个新的存储库,trunk而不是使用当前分支master.分支master实际上并不存在 - 分支在至少有一次提交之前不会被创建.在分支创建之前,分支仅存在.git/HEAD,这解释了为什么master切换到切换时分支将消失trunk.

如果您已经提交,则可以运行git branch -m:

git init
touch file.txt
git add file.txt
git commit -m 'commit 1'
git branch -m trunk
Run Code Online (Sandbox Code Playgroud)

这从重命名分支mastertrunk一旦创建它.

这似乎有点笨重,因为机制是不同的,取决于存储库是否为空,但它的工作原理.

  • “默认”有点用词不当。“当前分支”就是这里发生的事情。 (2认同)
  • 这看起来像GitHub概念,而不是Git概念.它讨论了拉取请求,而在Git中没有"拉取请求"这样的东西. (2认同)

小智 7

您可以间接配置git init使用不同的默认分支:当前分支是由HEAD"只是"一个文本文件来告诉git哪个ref是当前分支.

使用init.templateDir,你可以要求git init使用另一个:

# ~/.config/git/config or ~/.gitconfig
[init]
    templateDir = ~/.config/git/template/
Run Code Online (Sandbox Code Playgroud)

并且~/.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
Run Code Online (Sandbox Code Playgroud)

  • 供在 OSX 上遵循这些说明的任何人参考,您可能需要在 /usr/local/git/share/git-core/templates 中查找模板文件 (2认同)
  • 注意:您还可以在默认模板中创建一个“HEAD”文件,尽管它会告诉您在实际创建存储库时正在“重新初始化”存储库。 (2认同)