不使用 Gerrit 时 refs/for/master 是什么?

What is refs/for/master when not using Gerrit?

如果我没理解错,refs/for/ 是一个特殊的命名空间,即 used in Gerrit for uploading changes

但是,出于习惯,我刚刚在 一个非 Gerrit 存储库 上完成了 git push origin HEAD:refs/for/master,而不是 git push origin master,这显然有效:

$ git push origin HEAD:refs/for/master
Enumerating objects: [...]
[...]
To github.com:fstanis/myrepo.git
 * [new branch]      HEAD -> refs/for/master

这显然在 origin 上创建了一个新分支,但是当我尝试 git branch -r 时并没有列出这个分支,并且没有显示在 GitHub 的 UI 中。这里到底发生了什么?不使用 Gerrit 时,将提交推送到 refs/for/master "go" 哪里?

您刚刚在 origin 上创建了一个名为 refs/for/master 的引用。如果你 运行 git ls-remote,你就会看到它。使用 git branch -v 看不到它的原因是它在远程,而不是在本地存储库中。通常分支进入 refs/heads.

来自评论的 github 回购示例:

$ git ls-remote
From https://github.com/fstanis/test.git
6f073e5b9326e5faae3c3a52db352acba5b1e1b9    HEAD
ca16131c993c8cbf7aeb6b045186af0072a27e9e    refs/for/master
6f073e5b9326e5faae3c3a52db352acba5b1e1b9    refs/heads/master

当您将 refs/for/master 引用推送到远程时,您为引用创建了新的 namespace,ang 将其命名为 for.

长话短说,它允许为每个用户创建默认的引用子集以进行操作,并避免不同存储库用户组使用的引用的名称冲突。

用户可以在 remote.remote_name.fetch and remote.remote_name.push 配置值中设置自己的配置,这样最常见的分支和标签操作(pullpushfetch 等)将使用他们的首选命名空间,而不是存储库所有者定义的默认命名空间。

如果您认为 git 在创建具有所有默认配置的存储库时创建自己的硬编码命名空间,一个用于分支(heads) 和一个标签 (tags) 这样你就不需要在每个带有分支或标签的操作中为你的分支和标签名称添加前缀