首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >致命:无法将分支切换到不提交的“Branch_A”

致命:无法将分支切换到不提交的“Branch_A”
EN

Stack Overflow用户
提问于 2022-06-28 20:15:07
回答 1查看 158关注 0票数 0

当我做git switch Branch_A

我得到了错误fatal: Cannot switch branch to a non-commit 'Branch_A'

对于给定的存储库,仅在Ubuntu上。在Windows和Mac上,相同的命令工作正常,所有条件相同。

对同一存储库中的其他分支执行git switch操作很好,因此这个特定的分支似乎“有问题”。

sudo git switch Branch_A会给出:

代码语言:javascript
运行
复制
fatal: unsafe repository ('xyz' is owned by someone else)
to add an exception for this directory, call:
    git config --global --add safe.directory /pathToRepository

即使在将安全目录添加为sudo之后,结果也是一样。对所有文件和文件夹的chmod 777也没有帮助。即使是一个新的克隆人也会做同样的事情。

如果我运行git branch -aBranch_A确实是列出的。

我在所有操作系统上都执行相同的git clone操作。

我对案子也很小心,凯斯似乎不是问题所在。有趣的是,尝试使用不同的大小写排列(branch_a)切换会产生与上面相同的错误,就像git正在尝试的一样,相反,一个故意错误的分支名称会给fatal: invalid reference: bad_branch带来同样的错误。

git for-each-ref --format=$'%(objectname)^{} %(objecttype)\t%(refname)'| git cat-file --batch-check=$'%(objectname) %(objecttype)\t%(rest)'会给出:

08f0e890eda9cec780d73d71a2ffd19225fd1635 commit commit refs/heads/master 8882fd010c6d92eb5f586100888d90e6ea152acb commit commit refs/remotes/origin/Branch_F 5f8e4d2c4fffa827d4b5978b91157b59ddf0464a commit commit refs/remotes/origin/Branch_E c5a94160f9cd93fdab11e4ad484b8a1610d8acec commit commit refs/remotes/origin/Branch_D 166d1b17353457b58f31b1e5b96bbde5dc194b3e commit commit refs/remotes/origin/Branch_C d6db17a2d158d3869f50cd19c2721a102c399580 commit commit refs/remotes/origin/Branch_B 08f0e890eda9cec780d73d71a2ffd19225fd1635 commit commit refs/remotes/origin/HEAD 9d87e8538377bc39ac979ca32abe3c0fa91157c4 commit commit refs/remotes/origin/Branch_A 08f0e890eda9cec780d73d71a2ffd19225fd1635 commit commit refs/remotes/origin/master 80bb09b2a8f7c4dff83eeda7b424a426052f56c5 commit commit refs/tags/dbi-12856

怎样才能在我的Ubuntu机器上切换到这个分支呢?

EN

回答 1

Stack Overflow用户

发布于 2022-06-29 01:53:06

当我做git switch Branch_A时,我得到了错误fatal: Cannot switch branch to a non-commit 'Branch_A'

我可以通过创建一个包含无效散列ID的有效分支名来重现这个问题,其中哈希ID是tree对象而不是commit对象的。例如:

代码语言:javascript
运行
复制
$ git rev-parse refs/tags/v2.37.0^{tree} > .git/refs/heads/bogus
$ git switch bogus
fatal: Cannot switch branch to a non-commit 'bogus'
$ git update-ref -d refs/heads/bogus   # clean up

但是,请注意,我必须在这里完全绕过普通的Git机制。甚至git update-ref也拒绝写入树哈希ID:

代码语言:javascript
运行
复制
$ git update-ref refs/heads/bogus refs/tags/v2.37.0^{tree}
fatal: update_ref failed for ref 'refs/heads/bogus': cannot update ref
 'refs/heads/bogus': trying to write non-commit object
 a4a2aa60ab45e767b52a26fc80a0a576aef2a010 to branch 'refs/heads/bogus'

在这里,我不完全确定如何得到一个假的Branch_A名称,它指的是一棵树,但这似乎也起了作用:

代码语言:javascript
运行
复制
$ git tag treetag refs/tags/v2.37.0^{tree}
$ git switch treetag
fatal: Cannot switch branch to a non-commit 'treetag'

因此,您的名称Branch_A可能是一个标记名。试试git rev-parse --symbolic-full-name。例如:

代码语言:javascript
运行
复制
$ git rev-parse --symbolic-full-name treetag
refs/tags/treetag
$ git tag -d treetag
Deleted tag 'treetag' (was a4a2aa60ab)

如果这是问题所在,请删除不正确的名称(正如我前面对git tag -d所做的那样),然后使用git switchgit branch适当地创建正确的名称。您需要以某种方式找到正确的提交散列ID。

(在我看来,git switchgit checkout应该更多地注意一个简单的名称被证明是一个非分支名称的情况,就像在这个例子中一样。如果名称是commit,git switch将在这里要求使用--detach标志。)

如果您将运行git for-each-ref并将其输出(作为一个大代码块)附加到您的问题上,我想我们将更多地了解到底发生了什么。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72792642

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档