有人能解释一下我做错了什么吗?
$ git --version
git version 2.18.2
$ git checkout master
error: pathspec 'master' did not match any file(s) known to git.
$ git branch
* (HEAD detached at origin/trunk)
$ git branch -m master
fatal: Invalid branch name: 'HEAD'
一些背景:此存储库是使用git svn
创建的,我希望将origin/trunk
分支重命名为master
。
$ git branch -a
* (HEAD detached at origin/trunk)
remotes/origin/svn-branch1
remotes/origin/svn-branch2
...
2条答案
按热度按时间7rtdyuoh1#
TL;DR的名称
用途:
然后执行任何操作将此Git仓库复制到其他地方。如果 * 您不打算进一步导入SVN,请随意删除远程跟踪名称
origin/trunk
:如果愿意,可以对每个SVN分支名称重复此操作。
长
您需要了解的一些事项:
1.你没有 * 任何 * 枝,此刻一声:
1.你 * 确实 * 有一些 * 远程跟踪名称 *(Git调用这些 * 远程跟踪分支名称 *,但它们不是 * 分支名称 *,所以我在这里省略了 * 分支 * 一词)。
第一行当然是重复的,但它表明有一个
remotes/origin/trunk
,这里多出来的单词remotes
来自于这样一个事实,即每个单词的 * 全名都是refs/remotes/origin/*name*
; Git通常会省略refs/
和remotes/
,除了git branch -a
只在远程跟踪名称上省略了refs/
(没有明显的原因)。现在,
git checkout
不会自动创建一个(本地)分支名称,除非有一个匹配的远程跟踪名称。通常情况下,远程跟踪名称存在于您的Git仓库中是因为 * 分支 * 名称存在于其他Git仓库中。如果是这种情况,您需要在其他Git仓库中重命名这些分支。但在您的示例中,(还)没有其他Git仓库-只有一个SVN仓库。在SVN仓库中,有一个名称
trunk
,您的转换将该名称复制到了这里。你需要做的是创建一个本地分支名
master
,最简单的命令是git checkout -b master *starting-point*
,因为它也会把你 * 放在 * 那个分支上(你可能需要的),起点是你希望这个新名字master
引用的提交。1在这里,单词 * 分支 * 表示 * 分支名称 *。在Git的其他上下文中,它表示其他内容。Git分支与SVN分支并不完全对应。另请参阅What exactly do we mean by "branch"?
mpgws1up2#
在Git 2.39(Q4 2022)中,错误信息会更清晰:
2022年10月26日,Rubén Justo (
rjusto
)发布。(由Taylor Blau --
ttaylorr
--合并至commit 0c02561,2022年10月30日)第1001章:复制或重命名分离的HEAD时出错
签署人:鲁本·胡斯托
在c847f53(“分离的HEAD(实验性)",2007-01-01,Git v1.5.0-rc 1--merge)中,
rename_branch()
中引入了一个错误条件,以防止重命名分离的HEAD,随后也会复制分离的HEAD。使用的条件是检查
oldname
中的NULL
,即要重命名/复制的源分支。无法满足该条件,因为如果未指定源分支,则将在调用中使用HEAD。
而发出的错误为:
让我们删除
copy_or_rename_branch()
(当前函数名)中的条件,并在调用它之前检查HEAD,如果我们在一个分离的HEAD中,则会出现最初预期的错误。