我想使用git init
分支名称为prod的命令创建一个新的 git 存储库。我在本文档git init
中搜索了command支持的所有选项以覆盖默认分支名称master。
不幸的是,没有这样的选择。
自定义git的源代码是唯一的选择吗?
使用git 2.28.0,可以使用设置配置默认分支名称init.defaultBranch
git config --global init.defaultBranch prod
更多信息:https ://github.blog/2020-07-27-highlights-from-git-2-28/#introducing-init-defaultbranch
如果它是一个新的 git 存储库,你可以这样做
git checkout -b prod
你将站在一个名为“prod”的新分支上。
或者,如果您已经向它提交了一些东西,只需重命名主分支:
git branch -m master prod
此代码可以使用名为“prod”的分支创建一个新存储库
mkdir repo
cd repo
git init && git checkout -b prod
为了更改用户在克隆时签出的默认分支,您必须在远程存储库上创建一个HEAD
指针。通过运行,该参考在您的本地存储库中看起来像这样:
git branch -avv
remotes/origin/HEAD -> origin/master
默认情况下,这是master
,但您可以更改 Github 中的默认分支。其他托管服务在此问题中讨论了类似的方法。如果您是自托管的或对远程服务器具有 shell/文件系统访问权限,则可以使用以下命令手动设置:
git symbolic-ref HEAD refs/heads/prod
获取遥控器后,您应该会看到以下更新:
remotes/origin/HEAD -> origin/prod
现在,当用户克隆您的存储库时,他们将自动prod
签出分支。
然而,你的具体问题init
让我发现了 Github 的一个有趣的奇怪之处——即使存储库只有一个名为prod
它的分支,它也不会自动创建HEAD
指针。
让我们创建一个裸存储库,设置分支名称,然后提交:
git init
git checkout -b prod
touch file1
git add .
git commit -m 'init repo'
创建远程仓库:
curl --data '{"name":"myproject"}' -u YOUR_GITHUB_USERNAME https://api.github.com/user/repos
添加遥控器并推送:
git remote add origin https://github.com/YOUR_GITHUB_USERNAME/myproject.git
git push -u origin prod
为了测试这一点,让我们跳到一个新文件夹并克隆项目,看看它对其他人来说会是什么样子。
git clone https://github.com/YOUR_GITHUB_USERNAME/myproject.git
Cloning into 'myproject'... remote: Counting objects: 3, done. remote: Total 3 (delta 0), reused 3 (delta 0), pack-reused 0 Receiving objects: 100% (3/3), done. Checking connectivity... done. warning: remote HEAD refers to nonexistent ref, unable to checkout.
特别注意最后一行:
warning: remote HEAD refers to nonexistent ref, unable to checkout.
出于某种原因,Github 没有HEAD
为我们创建那个指针,所以 git 默认会回退到使用master
我们的 repo 中不存在的分支。因此,当您cd
进入新文件夹时,您会注意到您实际上已经签出了一个master
没有提交的裸分支,但是prod
如果您只是签出它,该分支就在那里。这很烦人,所以看起来我们仍然需要手动更新 Github 上的默认分支。
这就是它变得奇怪的地方。Github 已经将该分支显示为默认分支,因此我们无法更新它。
我想出解决此问题的唯一方法是创建另一个临时分支,将其更改为默认分支,然后将其更改回来。
现在,当有人克隆它时,他们将prod
自动签出分支。