更改 git init 默认分支名称

更改 git init 默认分支名称

我试图弄清楚如何使用git initmaster第一次提交之外的其他默认分支名称,但我找不到它的 git 配置或任何允许我这样做的东西(例如别名仅适用于命令,而不是分支名称)。

git init有什么办法可以改变设置的默认第一个分支名称吗?

答案1

从 Git 2.28(2020 年 7 月 27 日发布)开始,您现在可以配置初始化新存储库时创建的分支的名称

$ git config --global init.defaultBranch main

设置此变量后,运行git init将产生一个存储库,其初始分支为main

$ git init
Initialised empty Git repository in /home/thomas/test-git-repo/.git/
$ git status
On branch main

No commits yet

nothing to commit (create/copy files and use "git add" to track)

发行说明:https://lore.kernel.org/git/[电子邮件保护]/

答案2

HEAD在2.28 之前的 Git 版本中,硬编码指向refs/heads/master

if (create_symref("HEAD", "refs/heads/master", NULL) < 0)

因此,没有配置设置或选项可供您传递git init以将其更改为其他内容。

什么不过,也可以HEAD借助git initgit symbolic-ref

$ git init
$ git symbolic-ref HEAD refs/heads/test

这将更改为HEAD指向一个名为 的(尚不存在)分支test。然后,当您创建第一个提交时,将调用该分支test而不是master

答案3

更改默认 HEAD 的一个简单方法是在 git 模板目录中创建一个 HEAD。首先,将模板目录配置为~/Templates/git.git(或您喜欢的任何内容):

$ git config --global init.templateDir '~/Templates/git.git'
$ cp -r /usr/share/git-core/templates ~/Templates/git.git

HEAD然后,在模板目录中创建文件:

$ echo 'ref: refs/heads/default' > ~/Templates/git.git/HEAD

现在一切就绪!每次运行git init,您都会收到以下消息:

$ git init
Reinitialized existing Git repository in [...]

HEAD出于某种原因,git 根据中文件的存在来决定是否使用此消息.git,而不是依赖于是否.git必须创建。但是,它向您显示什么消息实际上并不重要。来自 git-init 手册页:

在现有存储库中运行git init是安全的。它不会覆盖已存在的内容。重新运行的主要原因git init是获取新添加的模板(或将存储库移至其他位置(如果--separate-git-dir指定))。

也就是说,git init保证不会覆盖HEAD您放入模板中的,也不会使用模板的HEAD覆盖现有的HEAD。由于这已明确记录,因此您可以依赖它。

此外,它还说:

模板目录中名称不以点开头的文件和目录将在$GIT_DIR创建后复制到其中。

这意味着您还可以依赖在创建后立即复制的模板.git,而不是在稍后复制。

(当然,这是我对手册的个人解读。git 开发人员完全有可能不同意。)

答案4

如上所述,HEAD 被硬编码为指向 master。但是,您可以创建一个 shell 别名,以便按照git init您喜欢的方式操作。如果您使用 bash 作为 shell,请在 .bashrc 中输入如下内容:

function git_init_fnc () {
  default_branch="main"
  if [[ $1 == "init" ]] && [[ $# -eq 1 ]];then
      git init
      if [[ ! -z $(git branch -a | grep $default_branch) ]]; then
          git checkout "$default_branch"
      else
          git checkout -b "$default_branch"
      fi
  else
      /usr/bin/git "$@"
  fi
}

alias "git"=git_init_fnc

git这将用函数 替换命令。除非您调用时没有其他参数,否则此函数将使命令git以完全相同的方式运行。当您调用它时,它将初始化存储库。接下来,它将检查分支“daddy”是否已存在。如果存在,它将检出该分支,否则它将创建该分支并将您移至该分支。git initgit init

相关内容