【发布时间】:2021-10-03 16:03:01
【问题描述】:
我正在尝试将本地存储库上传到 GitHub。在站点上创建一个新的 repo 后,GitHub 给出了在本地执行的以下指令:
git remote add origin https://github.com/MyOrg/repo-name.git
git branch -M main
git push -u origin main
当我执行它们时,git branch 步骤出现错误:
$ git remote add origin https://github.com/MyOrg/repo-name.git
$ git branch -M main
error: refname refs/heads/trunk not found
fatal: Branch rename failed
-M 标志为git branch 是-m(移动)和-f(强制)的组合,用于强制重命名分支。标准命令的格式为
$ git branch -M <oldbranch> <newbranch>
然而,在这里,GitHub 只给了我一个论点。我假设,因为没有人愿意费心说明这一点,这一论点是<newbranch>。
docs 只这么说
使用 -m 或 -M 选项,
<oldbranch>将重命名为<newbranch>。如果<oldbranch>有相应的 reflog,则将其重命名为匹配<newbranch>,并创建一个 reflog 条目以记住分支重命名。如果<newbranch>存在,则必须使用-M 来强制进行重命名。
没有解释当 <oldbranch> 未指定时会发生什么。我假设git branch 使用一些秘密算法来确定它应该为<oldbranch> 使用什么。知道这一点将帮助我找出导致错误的原因以及如何解决它。我可以知道git branch -M 如何处理单个参数吗?
分辨率
@bk2204 建议 git branch 隐含地将 <oldbranch> 作为当前分支,如果它没有作为命令的一部分提供的话。这足以假设,尽管权威来源仍然很棒。
@phd 然后建议了几种确定当前分支的方法。就我而言:
$ git branch --show-current
trunk
$ git rev-parse HEAD
HEAD
$ git symbolic-ref HEAD
refs/heads/trunk
由于我试图按照 GitHub 的说明明确引用 refs/heads/trunk 的错误,我进一步假设 git branch 调用 git symbolic-ref HEAD 以确定当前分支。同样,对此进行权威确认会很棒。
根据其documentation,git symbolic-ref 返回与符号引用“HEAD”关联的文件路径。
在我的情况下,返回的文件路径 refs/heads/trunk 不存在。相反,我有一个文件refs/heads/master:
$ ls -A1h refs/heads/
master
origin/
由于缺乏 GitHub 的指导,我必须假设这是他们希望我重命名为“main”的内容。我可以使用git branch -M 来做到这一点,并明确地将其提供为<oldbranch>:
$ git branch -M master main
$ ls -A1h refs/heads/
main
origin/
完成后,命令
$ git push -u origin main
按预期工作,并将 repo 推送到 GitHub。
【问题讨论】:
-
-m和-M选项到git branch已在 Git 2.30 中升级,以允许在特殊情况下重命名尚不存在的当前分支名称,例如当您在新的空存储库。当还没有提交时,还不能有任何分支名称。尽管如此,Git 要求您“在”某个分支,即使它不存在。在 2.30 之前的 Git 版本中,还有其他方法可以重命名不存在的分支,但显而易见的方法——git branch -m——直到那时才起作用。 -
@torek 这对上下文很有帮助,谢谢。不过,这不是一个空的 repo,它是一个从 SVN repo 转换而来的裸 repo。它有很多来自转换的提交。
-
啊,在那种情况下,只是转换软件不费心将当前分支名称设置为某个现有分支的问题。在您使用的任何转换软件中,这都是一个(小)错误......
标签: git github git-branch