在我们的公司里,使用我们的名字来区分特性并不少见。因此,如果我们在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
,进行更改,提交,然后推送.但同样的问题仍将失败。
有没有人知道这是如何发生的,以及我们能做些什么来解决这个问题?
发布于 2016-04-25 16:46:26
问题在服务器上,必须在服务器上修复(可能是通过在客户端上的操作来解决的;请参见下面)。
服务器正在向客户机提供尽可能多的合理信息(但请参见下面的内容):
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正在通过生成目录序列中的ENOENT
错误破坏文件路径的EEXIST
错误。(这将是git中的一个小错误:无论哪种方式,它都必须失败,但是它可以说“无法创建日志/参考/标题/米拉/测试,因为日志/参考/标题/米拉是一个常规文件”。此外,如果有一个未删除的分支(见下文),它应该会给出一个更清晰的错误信息;这将是git中的一个更大的错误。)
假设我的猜测(有这样一个文件)一开始是正确的,那么该文件是如何被丢弃的,这是一个谜。可能有一个名为mira
的分支,这需要创建一个名为logs/refs/heads/mira
的reflog文件,但是当它被删除时--为了创建一个名为mira/testing
的分支,它一定在某个时候被删除了;如果已经有一个分支,那么就不能有一个分支X/Y
,如果已经有一个分支,X
-that也应该删除这个分支。但是,如果这是问题所在,修复方法是如果您想要恢复文件内容,就移除该文件,否则只需将其全部删除。如果有一个未删除的分支以这种方式出现(在分支问题之前出现了reflog问题),您可以简单地删除分支,这也会删除reflog文件。
您还可以禁用core.logAllRefUpdates
。通常情况下,它将被禁用,因为这应该是一个--bare
存储库。
关于core.logAllRefUpdates
这一点在 documentation中描述得相当好
core.logAllRefUpdates
启动雷射。通过附加新的和旧的SHA-1、更新的日期/时间和更新的原因,ref的更新将被记录到文件"$GIT_DIR/logs/“中,但只在文件存在时。如果此配置变量设置为true,则会自动为分支头(即参考/头/)、远程参考(即参考/远程/)、注参(即参考/注释/)和符号引用头创建缺少的“$GIT_DIR/log/”文件。 此信息可用于确定“两天前”分支的提示是什么。 默认情况下,此值在具有与其关联的工作目录的存储库中为真,在裸存储库中默认为false。
https://stackoverflow.com/questions/36853142
复制相似问题