git push某些分支名称失败

时间:2016-04-25 23:58:56

标签: git bitbucket

在我们公司,使用我们的名称分支功能并不罕见。因此,如果我们在master并且想要分支新功能,我们会创建john/feature-testbob/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'

当我在我的机器上尝试这个时,我得到同样的东西。所以问题似乎是Bitbucket上的远程git服务器。我们已尝试删除所有以mira/...开头并且没有帮助的分支机构。我已经修剪了远程和本地,运行了git gc等等。似乎没什么用。

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

有没有人知道如何发生这种情况以及我们可以采取哪些措施来解决这个问题?

1 个答案:

答案 0 :(得分:2)

服务器上的问题,必须在那里修复(可能是通过客户端上的操作;见下文)。

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

  

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

我们可以从中得出结论:

  • 服务器配置设置core.logAllRefUpdates(见下文)
  • 文件logs/refs/heads/mira/testing目前不存在(见下文)
  • logs/refs/heads/mira中的某些目录/目录也存在/不存在
  • 执行推送的过程也无法创建该目录,因为某些先前目录不存在(这是神秘的部分,因为git将根据需要创建路径中的每个目录)。

应该在服务器上进行进一步的调查,但最可能的问题是logs/refs/heads/mira已经作为普通文件而不是目录存在,并且git正在破坏文件路径的EEXIST错误在make-directories序列期间出现ENOENT错误。 (这将是git中的一个小错误:无论哪种方式都必须失败,但它可能会说&#34;无法创建日志/ refs / heads / mira /测试因为logs / refs / heads / mira是一个常规文件&#34但是,例如。此外,如果在路上有一个未删除的分支 - 见下文 - 它应该给出一个更清晰的错误消息;这将是git中的一个更大的错误。)

这个文件如何被遗忘是一个谜,假设我的猜测(有这样的文件)首先是正确的。可能有一个名为mira的分支,它需要创建一个名为logs/refs/heads/mira的reflog文件,但是当它被删除时 - 为了创建一个名为{{1}的分支,它必须在某个时刻被删除};如果已经存在分支mira/testing,则不能有分支X/Y - 该分支也应该删除了reflog。但是如果这个 问题,那么修复就是将文件移开,如果你想要它的内容,或者如果没有它就完全删除它。如果路径中存在未删除的分支(在分支问题之前出现reflog问题),您只需删除分支,这也将删除reflog文件。

您也可以停用X。通常它会被禁用,因为它应该是core.logAllRefUpdates存储库。

关于--bare

这在the git config documentation中的描述相当不错:

  

core.logAllRefUpdates

     

启用reflog。对ref&lt; ref&gt;的更新记录到文件&#34; $ GIT_DIR / logs /&lt; ref&gt;&#34;,通过附加新旧SHA-1,日期/时间和更新原因,但仅在文件存在时。如果此配置变量设置为true,则缺少&#34; $ GIT_DIR / logs /&lt; ref&gt;&#34;文件是为分支头(即在refs / heads /下),远程引用(即在refs / remotes /下),注意引用(即在refs / notes /下)和符号引用HEAD而自动创建的。

     

此信息可用于确定哪些提交是分支的提示&#34; 2天前&#34;。

     

默认情况下,此值在具有与之关联的工作目录的存储库中为true,默认情况下在裸存储库中为false。