在我们公司,使用我们的名称分支功能并不罕见。因此,如果我们在master
并且想要分支新功能,我们会创建john/feature-test
或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'
当我在我的机器上尝试这个时,我得到同样的东西。所以问题似乎是Bitbucket上的远程git服务器。我们已尝试删除所有以mira/...
开头并且没有帮助的分支机构。我已经修剪了远程和本地,运行了git gc
等等。似乎没什么用。
有趣的是我们可以进入Bitbucket,创建一个名为mira/testbranch
的分支,运行git fetch
,运行git checkout mira/testbranch
,进行更改,提交,然后推送...但推送仍然会因同样的问题而失败。
有没有人知道如何发生这种情况以及我们可以采取哪些措施来解决这个问题?
答案 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
中的某些目录/目录也存在/不存在应该在服务器上进行进一步的调查,但最可能的问题是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。