【问题标题】:How can I create a Git repository with the default branch name other than "master"?如何使用“master”以外的默认分支名称创建 Git 存储库?
【发布时间】:2017-08-09 20:07:52
【问题描述】:

Pro Git book,它说

“起源”并不特殊

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

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

GitHub shows how to set the default branch name 在其设置页面中。但我不是在谈论如何在任何特定的 Git 托管站点 上设置它。我严格要求只针对 Git,而不是针对任何特定的 Git 托管站点

有没有办法做到这一点?

【问题讨论】:

标签: git version-control


【解决方案1】:

如果您使用 Azure Devops:

  1. 在您的项目 repo 下,选择 Branches。

  2. 在分支页面上,选择所需的新默认分支旁边的更多选项,然后选择设置为默认分支。

  1. 设置新的默认分支后,您可以根据需要删除之前的默认分支。

【讨论】:

    【解决方案2】:

    较新的 Git,新的存储库

    从 git 版本 2.28.0 开始,git init 命令现在采用 --initial-branch(或简称为 -b)参数。这两个命令创建了一个新的 Git 存储库,其中有一个名为“trunk”的分支,这对我来说总是比“master”(什么大师?)更有意义:

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

    这可以通过init.defaultBranch 设置进行配置。如果我希望所有新仓库都将“主干”作为默认分支:

    git config --global init.defaultBranch trunk
    

    旧版 Git,新版仓库

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

    git init
    git checkout -b trunk
    

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

    裸回购

    对于裸仓库,您不能运行 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 ?
    • “默认”有点用词不当。 “当前分支”确实是这里发生的事情。
    • help.github.com/articles/setting-the-default-branch 谈到了默认分支,所以我有点困惑。我对你说的做了一点实验。事实证明,在 git 中没有像“默认”这样的东西。谢谢
    • 这看起来像是 GitHub 概念,而不是 Git 概念。它谈到了拉取请求,在 Git 中没有“拉取请求”之类的东西。
    • 我只是在寻找这样的东西
    【解决方案3】:

    如何使用“master”以外的默认分支名称创建 Git 存储库?

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

    还有来自Aug. 2020 from GitHub的提醒:

    在 2020 年 10 月 1 日,如果您尚未更改用户、组织或企业的新存储库的默认分支,它将自动从 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,2020 年第三季度) 见commit 508fd8e(2020 年 6 月 29 日)Đoàn Trần Công Danh (sgn)
    请参阅commit 0068f21commit a471214commit 0cc1b47commit 32ba12dcommit 6069ecccommit f0a96e8commit 4d04658(2020 年 6 月 24 日)和commit 489947c(2020 年 6 月 23 日)@9876543。
    请参阅 Don Goodman-Wilson (DEGoodmanWilson)commit 8747ebb(2020 年 6 月 24 日)。
    (由 Junio C Hamano -- gitster -- 合并于 commit 11cbda2,2020 年 7 月 6 日)

    init: 允许指定新仓库的初始分支名称

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

    越来越多的项目和公司希望更改其存储库的主分支名称(例如,请参阅 Mislav Marohnić's tweet 了解这方面的背景)。

    要为新存储库更改该分支名称,目前唯一自动执行此操作的方法是复制所有 Git 的模板目录,然后将所需的默认分支名称硬编码到 .git/HEAD 文件中,然后配置 @987654384 @ 指向那些复制的模板文件。

    为了简化这个过程,让我们引入一个新选项:--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.defaultBranch 配置设置。

    注意:commit 489947c,关于合并提交消息,已在 Git 2.29 中恢复,请参阅“how can I customize git's merge commit message?”。
    init.defaultBranch 设置仍然存在。


    这会影响子模块:

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

    协助人:Philippe Blain
    签字人:Johannes Schindelin

    remote.<name>.branch 未配置时,git submodule update 当前回退到使用分支名称 master
    然而,一个更好的主意是使用远程 HEAD:在所有运行合理最新 Git 版本的 Git 服务器上,symref HEAD 指向主分支。

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

    即便如此,应该可以在没有较长过渡期的情况下修复此行为:

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

    请注意,在 Git 2.29(2020 年第四季度)中,contrib/ 中的测试已调整为最近更改为 fmt-merge-msg

    参见Emily Shaffer (nasamuffin)commit b87528c(2020 年 8 月 3 日)。
    (由 Junio C Hamano -- gitster -- 合并到 commit 83b8250,2020 年 8 月 10 日)

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

    签字人:Emily Shaffer

    这将还原commit 508fd8e8baf3e18ee40b2cf0b8899188a8506d07

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

    还有:

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

    参见Johannes Schindelin (dscho)commit f33f2d3commit b6211b8(2020 年 9 月 26 日)和 commit 432f5e6commit 5a0c32bcommit 659288c(2020 年 9 月 21 日)。
    (由 @987654361 合并@in commit 58138d3,2020 年 10 月 5 日)

    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:

    commit 538228ecommit a15ad5d(2020 年 10 月 8 日)Johannes Schindelin (dscho)
    (由 Junio C Hamano -- gitster -- 合并到 commit 62564ba,2020 年 10 月 8 日)

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

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

    为了准备将 init.defaultBranch 的后备更改为 main 的补丁系列,我们不要在此测试脚本中使用 main 作为引用名称。

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

    由于所讨论的 refs 是工作树本地的(即每个工作树都有自己的,就像HEAD),并且由于测试用例已经使用了一个名为“second”的辅助工作树,所以我们使用名称“ first" 代替那些参考。

    同时,调整讨论“repo”的测试标题,而不是“工作树”。

    【讨论】:

      【解决方案4】:

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

      默认保持为master

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

      $ git config --global init.defaultBranch main
      

      阅读 git doc 章节了解更多详情Introducing init.defaultBranch

      【讨论】:

      【解决方案5】:

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

      【讨论】:

      • 仅供参考,对于在 OSX 上遵循这些说明的任何人,您可能需要在 /usr/local/git/share/git-core/templates 中查找模板文件
      • 注意:您也可以在默认模板中创建一个 HEAD 文件,但它会告诉您在实际创建存储库时正在“重新初始化”存储库。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-03-09
      • 2018-09-08
      • 2016-12-19
      • 2022-09-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多