某些分支名称的git推送失败

某些分支名称的git推送失败,git,bitbucket,Git,Bitbucket,在我们公司,使用我们的名字来划分功能是很常见的。因此,如果我们在master上,并且想要分支一个新特性,我们将创建john/featuretest或bob/feature-test2。直到最近,我们的一个队友失去了将任何东西推到原点的能力 她可以创建其他分支,但如果分支以mira/..开头,则会失败,如下所示: $ git push -f Counting objects: 2, done. Delta compression using up to 4 threads. Compressing

在我们公司,使用我们的名字来划分功能是很常见的。因此,如果我们在
master
上,并且想要分支一个新特性,我们将创建
john/featuretest
bob/feature-test2
。直到最近,我们的一个队友失去了将任何东西推到原点的能力

她可以创建其他分支,但如果分支以
mira/..
开头,则会失败,如下所示:

$ git push -f
Counting objects: 2, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (2/2), 243 bytes | 0 bytes/s, done.
Total 2 (delta 1), reused 0 (delta 0)
remote: error: Cannot update the ref 'refs/heads/mira/testing': unable to create directory for logs/refs/heads/mira/testing: No such file or directory
To git@bitbucket.org:<team>/<repo>.git
 ! [remote rejected] mira/testing -> mira/testing (failed to update ref)
error: failed to push some refs to 'git@bitbucket.org:<team>/<repo>.git'
$git推送-f
计数对象:2,完成。
增量压缩最多使用4个线程。
压缩对象:100%(2/2),完成。
写入对象:100%(2/2),243字节| 0字节/秒,完成。
总计2(增量1),重复使用0(增量0)
远程:错误:无法更新ref“refs/heads/mira/testing”:无法为日志/refs/heads/mira/testing创建目录:没有这样的文件或目录
到git@bitbucket.org:/.git
! [远程拒绝]mira/测试->mira/测试(更新ref失败)
错误:无法将某些引用推送到'git@bitbucket.org:/.git'
当我在我的机器上尝试这个时,我得到了同样的结果。因此,问题似乎出在Bitbucket上的远程git服务器上。我们已尝试删除所有以
mira/..
开头的分支,但没有任何帮助。我删除了远程和本地,运行了一个
git-gc
,等等。。似乎什么都不管用

有趣的是,我们可以进入Bitbucket,创建一个名为
mira/testbranch
的分支,运行
git fetch
,运行
git checkout mira/testbranch
,进行更改、提交,然后推送。。。但推动仍将因同样的问题而失败

有人知道这是如何发生的吗?我们可以做些什么来解决它?

问题在服务器上,必须在服务器上解决(可能通过对客户端执行操作;请参见下文)

服务器向客户端提供尽可能多的信息(但请参见下文):

remote:错误:无法更新ref'refs/heads/mira/testing':无法为日志/refs/heads/mira/testing创建目录:没有这样的文件或目录

从中我们可以得出以下结论:

  • 服务器配置设置了
    core.logAllRefUpdates
    set(见下文)
  • 文件
    logs/refs/heads/mira/testing
    当前不存在(见下文)
  • logs/refs/heads/mira
    中的一些目录也不存在
  • 执行推送的进程也无法创建该目录,因为某些前置目录不存在(这是一个神秘的部分,因为git将根据需要创建路径中的每个目录)
可能会在服务器上进行进一步的调查,但最可能的问题是,
logs/refs/heads/mira
已经作为普通文件而不是目录存在,并且git在生成目录序列期间正在使用
enoint
错误来消除文件路径的
EEXIST
错误。(这可能是git中的一个小错误:无论哪种方式,它都必须失败,但它可能会说“无法创建日志/refs/heads/mira/testing,因为日志/refs/heads/mira是一个常规文件”,例如。此外,如果有一个未删除的分支,如下图所示,它应该会给出更清晰的错误消息;这将是git中更大的错误。)

假设我的猜测(有这样一个文件)一开始是正确的,那么那个文件是如何被留下的是一个谜。可能有一个名为
mira
的分支,它需要创建一个名为
logs/refs/heads/mira
的reflog文件,但当它被删除时,为了创建一个名为
mira/testing
的分支,它必须在某个时候被删除;如果已经有分支
X
,则不能有分支
X/Y
——该分支也应该删除reflog。但如果这是一个问题,那么解决方法是如果您想要恢复文件内容,就将其移到一边,否则就将其完全删除。如果途中有未删除的分支(分支问题之前会出现reflog问题),您可以简单地删除该分支,这也会删除reflog文件

您还可以禁用
core.logAllRefUpdates
。通常它会被禁用,因为这应该是一个
--bare
存储库

关于
core.logAllRefUpdates
这在以下章节中有很好的描述:

core.logAllRefUpdates

启用reflog。ref的更新记录在文件“$GIT_DIR/logs/”中,方法是添加新的和旧的SHA-1、更新的日期/时间和原因,但仅当文件存在时。如果此配置变量设置为true,则会自动为分支标头(即在refs/heads/下)、远程引用(即在refs/remotes/下)、注释引用(即在refs/notes/下)和符号引用标头创建缺少的“$GIT_DIR/logs/”文件

此信息可用于确定“2天前”分支的提示是什么

该值在具有与其关联的工作目录的存储库中默认为true,在裸存储库中默认为false


如果我猜的话,这是因为您的分支名称中有一个斜杠,而且不知何故,您启用的某些post接收日志挂钩无法处理它。它试图为分支创建一个目录,但没有运行
mkdir-p$branchname
它只是运行
mkdir$branchname
,但是当分支名称中有斜杠时,它失败了。这只是基于git知识和错误消息的猜测,但根本不了解bitbucket。请尝试下面介绍的解决方案: