当我做git switch Branch_A
时
我得到了错误fatal: Cannot switch branch to a non-commit 'Branch_A'
对于给定的存储库,仅在Ubuntu上。在Windows和Mac上,相同的命令工作正常,所有条件相同。
对同一存储库中的其他分支执行git switch
操作很好,因此这个特定的分支似乎“有问题”。
做sudo git switch Branch_A
会给出:
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 -a
,Branch_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机器上切换到这个分支呢?
发布于 2022-06-29 01:53:06
当我做
git switch Branch_A
时,我得到了错误fatal: Cannot switch branch to a non-commit 'Branch_A'
我可以通过创建一个包含无效散列ID的有效分支名来重现这个问题,其中哈希ID是tree
对象而不是commit
对象的。例如:
$ 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:
$ 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
名称,它指的是一棵树,但这似乎也起了作用:
$ 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
。例如:
$ git rev-parse --symbolic-full-name treetag
refs/tags/treetag
$ git tag -d treetag
Deleted tag 'treetag' (was a4a2aa60ab)
如果这是问题所在,请删除不正确的名称(正如我前面对git tag -d
所做的那样),然后使用git switch
或git branch
适当地创建正确的名称。您需要以某种方式找到正确的提交散列ID。
(在我看来,git switch
和git checkout
应该更多地注意一个简单的名称被证明是一个非分支名称的情况,就像在这个例子中一样。如果名称是commit,git switch
将在这里要求使用--detach
标志。)
如果您将运行git for-each-ref
并将其输出(作为一个大代码块)附加到您的问题上,我想我们将更多地了解到底发生了什么。
https://stackoverflow.com/questions/72792642
复制相似问题