如何克隆一个没有提交的裸 git 回购并在克隆期间获得正确的 HEAD 引用?

How to clone a bare git repo with no commits and get the correct HEAD ref during the clone?

This answer claims that the issue was fixed in version 1.8.4.3, but I still encounter it in version 2.25.1. It appears to work as expected in version 2.32.0, so I'm not sure when it was actually fixed.

有没有办法使用 clone 子命令在 git 版本 2.25.1 中获得预期的行为(克隆后不必 checkout/switch 分支)?

复制步骤如下:


  1. 初始化一个裸仓库:
BARE_DIR="$PWD/bare"
WORKING_DIR="$PWD/working"

mkdir -p $BARE_DIR/repo
cd $BARE_DIR/repo
git init --bare
  1. 更改 HEAD 参考:
git symbolic-ref HEAD refs/heads/very-unlikely-to-be-your-configured-default-branch
  1. 克隆存储库的工作副本:
mkdir $WORKING_DIR
cd $WORKING_DIR
git clone $BARE_DIR/repo
cd repo
  1. 检查 HEAD 参考:
cat .git/HEAD

我希望输出为:

ref: refs/heads/very-unlikely-to-be-your-configured-default-branch

而是:

ref: refs/heads/master

没有提交就没有分支。

尽管 Git 可以在现代 Git 中从另一个 Git 读取默认分支名称,因此可以使用正确的 创建一个新的克隆ref: refs/heads/<em>name</em> 条目,Git 2.25 没有。如果是这样,新克隆中未出生的分支将与裸存储库中未出生的分支相匹配。这就是你想要的。但直到 Git 2.31.0,Git 才这样做。

如果您无法升级,解决方案是让您正在克隆的存储库至少包含一个提交,这样它就可以拥有无​​限多的分支名称。然后在该存储库中至少创建一个 分支名称 ——尽管实际上,创建第一个提交将为您创建一个分支名称——并使其 HEAD 指向所需的名称分支名称.