gerrit 问题: 删除某个 git project 的分支出错

256 views
Skip to first unread message

Chunlin Zhang

unread,
Oct 11, 2011, 6:09:29 AM10/11/11
to got...@googlegroups.com
zhangclb@zhangclb2:/media/t/Browser$ git push origin :master
To sma:/platform/packages/apps/Browser.git
 ! [remote rejected] master (branch is currently checked out)
error: failed to push some refs to 'sma:/platform/packages/apps/Browser.git'

上 gerrit 看这个 git project 的分支情况,看到HEAD 在 master 上,因为是不能删除的原因

但是不知道该怎么处理,版主给支支招?
谢谢!

Jiang Xin

unread,
Oct 12, 2011, 2:22:40 AM10/12/11
to GotGit
先撇开Gerrit不谈,一个Git版本库用 HEAD 文件标识当前分支(即使是裸版本库),
如果删除HEAD标识的默认分支,会发出警告:

remote: error: By default, deleting the current branch is denied,
because the next
remote: error: 'git clone' won't result in any file checked out,
causing confusion.
remote: error:
remote: error: You can set 'receive.denyDeleteCurrent' configuration
variable to
remote: error: 'warn' or 'ignore' in the remote repository to allow
deleting the
remote: error: current branch, with or without a warning message.
remote: error:
remote: error: To squelch this message, you can set it to 'refuse'.
remote: error: refusing to delete the current branch: refs/heads/
master

就是说如果想要删除HEAD标识的当前分支,可以设置 receive.denyDeleteCurrent
为 warn 或者 ignore。一旦远程版本库包含了 receive.denyDeleteCurrent 为 ignore
的设置后,就可以远程删除版本库任意分支,甚至是远程版本库中用 HEAD 文件标识的
当前分支。

有两种方法可以对远程服务器中创建的新版本库自动设置 receive.denyDeleteCurrent,
一种是通过书中P562页介绍的Git模版,即在模版目录中添加一个 config 文件。
另外一种方法是使用 gitolite 做服务器,通过在配置文件中添加相应 config 指令,见 P439.

Gerrit 重造了轮子,用 Java 重新实现了Git(JGit),因此有些细节没有模仿出来,例如
receive.denyDeleteCurrent。我在 Gerrrit 2.1.8 上没有发现删除当前分支的好办法,除非
将当前分支指向另外一个,才能删除。

Chunlin Zhang

unread,
Oct 12, 2011, 2:27:27 AM10/12/11
to got...@googlegroups.com
2011/10/12 Jiang Xin <worldhe...@gmail.com>:

> Gerrit 重造了轮子,用 Java 重新实现了Git(JGit),因此有些细节没有模仿出来,例如
> receive.denyDeleteCurrent。我在 Gerrrit 2.1.8 上没有发现删除当前分支的好办法,除非
> 将当前分支指向另外一个,才能删除。

我到 repo-discuss 里问的结果和你说的差不多,有人说给出了移动 HEAD 的命令: 'git symbolic-ref HEAD
refs/heads/mybranch'

之后试试看行不行

Jiang Xin

unread,
Oct 12, 2011, 2:40:37 AM10/12/11
to GotGit
git symbolic-ref HEAD refs/heads/mybranch 就是将HEAD指向另外的引用(即使不存在),
然后再删除之前 HEAD 指向的分支。这个方法肯定是可以的。

GitHub 解决这个问题,是提供一个Web界面可以更改当前版本库HEAD指向的分支。参见:

http://gotgit.github.com/gotgithub/03-project-hosting/020-repo-operation.html

中的 "3.2.3. 设置默认分支" 和 "3.2.4. 删除分支"。

看看 jgit 代码,也许能找到更优雅的方式?或者向 jgit 提出改进需求。


On Oct 12, 2:27 pm, Chunlin Zhang <zhangchun...@gmail.com> wrote:
> 2011/10/12 Jiang Xin <worldhello....@gmail.com>:

Chunlin Zhang

unread,
Oct 12, 2011, 3:36:55 AM10/12/11
to got...@googlegroups.com
2011/10/12 Jiang Xin <worldhe...@gmail.com>:

> git symbolic-ref HEAD refs/heads/mybranch 就是将HEAD指向另外的引用(即使不存在),
> 然后再删除之前 HEAD 指向的分支。这个方法肯定是可以的。
>
> GitHub 解决这个问题,是提供一个Web界面可以更改当前版本库HEAD指向的分支。参见:
>
> http://gotgit.github.com/gotgithub/03-project-hosting/020-repo-operation.html
>
> 中的 "3.2.3. 设置默认分支" 和 "3.2.4. 删除分支"。
>
> 看看 jgit 代码,也许能找到更优雅的方式?或者向 jgit 提出改进需求。

试过是可以,不过是要在服务端做这个事情,是比较ugly,不过还好很少有这种情况.

>
>
> On Oct 12, 2:27 pm, Chunlin Zhang <zhangchun...@gmail.com> wrote:
>> 2011/10/12 Jiang Xin <worldhello....@gmail.com>:
>>
>> > Gerrit 重造了轮子,用 Java 重新实现了Git(JGit),因此有些细节没有模仿出来,例如
>> > receive.denyDeleteCurrent。我在 Gerrrit 2.1.8 上没有发现删除当前分支的好办法,除非
>> > 将当前分支指向另外一个,才能删除。
>>
>> 我到 repo-discuss 里问的结果和你说的差不多,有人说给出了移动 HEAD 的命令: 'git symbolic-ref HEAD
>> refs/heads/mybranch'
>>
>> 之后试试看行不行
>

> --
> 您收到这封邮件是因为您订阅了 Google Groups "GotGit" 邮件组。
> 向邮件组发言很简单,发送邮件到: got...@googlegroups.com 即可。
> 如果不想继续收到相关邮件,发送退订邮件到 gotgit+un...@googlegroups.com
> 您也可以通过 Web 界面访问和配置本邮件列表:
> http://groups.google.com/group/gotgit?hl=en?hl=en
>

Jiang Xin

unread,
Oct 12, 2011, 4:30:53 AM10/12/11
to GotGit
实际上Gerrit的Web界面提供了删除分支的功能(管理员登录)。不过 2.1.8 版本还不能通过界面重新设定HEAD指向,
只能删除其他分支,也许以后 Gerrit 提供类似 GitHub 重新设定 HEAD 指向功能。

从命令行想办法是行不通的,因为 JGit 代码中没有对 'receive.denyDeleteCurrent' 的支持。

On Oct 12, 3:36 pm, Chunlin Zhang <zhangchun...@gmail.com> wrote:
> 2011/10/12 Jiang Xin <worldhello....@gmail.com>:

> > 看看 jgit 代码,也许能找到更优雅的方式?或者向 jgit 提出改进需求。
>
> 试过是可以,不过是要在服务端做这个事情,是比较ugly,不过还好很少有这种情况.
>

Chunlin Zhang

unread,
Oct 12, 2011, 5:17:30 AM10/12/11
to got...@googlegroups.com
2011/10/12 Jiang Xin <worldhe...@gmail.com>:

> 实际上Gerrit的Web界面提供了删除分支的功能(管理员登录)。不过 2.1.8 版本还不能通过界面重新设定HEAD指向,
我这里用的还只是 2.1.6.1.
不过之后要换新服务器了,到时候要升到新版本看看

> 只能删除其他分支,也许以后 Gerrit 提供类似 GitHub 重新设定 HEAD 指向功能。
>
> 从命令行想办法是行不通的,因为 JGit 代码中没有对 'receive.denyDeleteCurrent' 的支持。

这个没看懂是啥意思...


>
> On Oct 12, 3:36 pm, Chunlin Zhang <zhangchun...@gmail.com> wrote:
>> 2011/10/12 Jiang Xin <worldhello....@gmail.com>:
>
>> > 看看 jgit 代码,也许能找到更优雅的方式?或者向 jgit 提出改进需求。
>>
>> 试过是可以,不过是要在服务端做这个事情,是比较ugly,不过还好很少有这种情况.
>>
>

Reply all
Reply to author
Forward
0 new messages