解決Gerrit的git unpack error問題


今天上午同事和我說neutron項目要換成全新的內部代碼,原先倉庫里的代碼要全部廢棄掉。於是我就簡單地創建了一個空項目使用git push --force將其置空。

下午的時候,麻煩事情就來了,同事發現提交patch的時候,會發現如下報錯:

remote: Resolving deltas: 100% (2/2)
error: unpack failed: error Missing unknown 613fd2557fba30aff2dbd51c3807cc57561bab08
fatal: Unpack error, check server log
To ssh://newptone@review.ustack.com:29418/neutron.git
 ! [remote rejected] HEAD -> refs/publish/datong (n/a (unpacker error))
error: failed to push some refs to 'ssh://newptone@review.ustack.com:29418/neutron.git'

通過google我找到了兩篇文章:

《Gerrit Code Review - Unpack error Missing unknown》一文是說git的某object受損導致:

http://asheepapart.blogspot.jp/2011/10/gerrit-code-review-unpack-error-missing.html

我使用文提供的方法發現根本就不存在 613fd2557fba30aff2dbd51c3807cc57561bab08 object。

然后我又搜到了一個在stackoverflow上的相關提問:

http://stackoverflow.com/questions/16586642/git-unpack-error-on-push-to-gerrit

提問指出如果你使用了git 1.8 + gerrit 2.7版本的組合,就會出現這樣的問題,可惜的是我所使用的git和gerrit版本均低於此。

 

鑒於網上沒有靠譜的解決辦法,只能自己去查問題所在了。先查看了gerrit的日志:

[2014-01-07 03:57:15,400] ERROR com.google.gerrit.sshd.BaseCommand : Internal server error (user newptone account 1) during git-receive-pack '/neutron.git'
com.google.gerrit.sshd.BaseCommand$Failure: fatal: Unpack error, check server log
        at com.google.gerrit.sshd.commands.Receive.runImpl(Receive.java:157)
        at com.google.gerrit.sshd.AbstractGitCommand.service(AbstractGitCommand.java:106)
        at com.google.gerrit.sshd.AbstractGitCommand.access$000(AbstractGitCommand.java:34)
        at com.google.gerrit.sshd.AbstractGitCommand$1.run(AbstractGitCommand.java:72)
        at com.google.gerrit.sshd.BaseCommand$TaskThunk.run(BaseCommand.java:430)
        at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471)
        at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:334)
        at java.util.concurrent.FutureTask.run(FutureTask.java:166)
        at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$101(ScheduledThreadPoolExecutor.java:165)
        at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:266)
        at com.google.gerrit.server.git.WorkQueue$Task.run(WorkQueue.java:337)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1146)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
        at java.lang.Thread.run(Thread.java:701)
Caused by: java.io.IOException: Unpack error on project "neutron":
  AdvertiseRefsHook: org.eclipse.jgit.transport.AdvertiseRefsHookChain@77348c71class org.eclipse.jgit.transport.AdvertiseRefsHookChain

        at com.google.gerrit.sshd.commands.Receive.runImpl(Receive.java:156)
        ... 13 more
Caused by: org.eclipse.jgit.errors.UnpackException: Exception while parsing pack stream
        at org.eclipse.jgit.transport.ReceivePack.service(ReceivePack.java:202)
        at org.eclipse.jgit.transport.ReceivePack.receive(ReceivePack.java:142)
        at com.google.gerrit.sshd.commands.Receive.runImpl(Receive.java:98)
        ... 13 more
Caused by: org.eclipse.jgit.errors.MissingObjectException: Missing unknown 613fd2557fba30aff2dbd51c3807cc57561bab08
        at org.eclipse.jgit.storage.file.WindowCursor.open(WindowCursor.java:125)
        at org.eclipse.jgit.lib.ObjectReader.open(ObjectReader.java:228)
        at org.eclipse.jgit.revwalk.RevWalk.parseAny(RevWalk.java:812)
        at org.eclipse.jgit.transport.BaseReceivePack.checkConnectivity(BaseReceivePack.java:956)
        at org.eclipse.jgit.transport.BaseReceivePack.receivePackAndCheckConnectivity(BaseReceivePack.java:756)
        at org.eclipse.jgit.transport.ReceivePack.service(ReceivePack.java:167)
        ... 15 more

 

那么就定義到613fd2557fba30aff2dbd51c3807cc57561bab08這串哈希值,為什么會丟失這個object ?

我順手敲了一個 git review -l,發現gerrit上居然有一個還沒有關閉的patch:

1974  master  Add two interfaces for manipulate forwarding individually

我打開Gerrit web界面,點擊這個patchset,跳出一段錯誤說明:613fd2557fba30aff2dbd51c3807cc57561bab08 cannot  found.

 

啊哈,到這里真相就大白了。原因就是上午我在刪除原先的舊有neutron代碼時,忘記把gerrit上相關的neutron提交做關閉處理,而輸入git review命令時,gerrit會先做一個rebase操作,再做提交,然而neutron倉庫發生變化后,存在數據庫中的1974號patch_set找不到對應的object了,所以在執行:git push gerrit HEAD:refs/publish/datong 操作時發生了前面的問題。

事已至此,解決的辦法就是到reviewdb數據庫里,先從patch_sets表中找出change_id是1974的記錄,確定無誤后,我們從changes表中找出對應的記錄:

mysql> select * from changes where change_id=1974\G;
*************************** 1. row ***************************
            change_key: I6596720099473969b19675f8fbb97a2db29b5532
            created_on: 2014-01-06 12:20:07
       last_updated_on: 2014-01-07 03:02:09
              sort_key: 002a4736000007b6
      owner_account_id: 25
     dest_project_name: neutron
      dest_branch_name: refs/heads/master
                  open: Y
                status: n
        nbr_patch_sets: 1
  current_patch_set_id: 1
               subject: Add two interfaces for manipulate forwarding individually
                 topic: portforwarding-api
last_sha1_merge_tested: NULL
             mergeable: N
           row_version: 2
             change_id: 1974
1 row in set (0.00 sec)

 

我們要做的是將其關閉,並把狀態置為Abandon。(友情提醒,涉及重要業務,注意備份數據庫)

mysql> update changes set open='N',status='A' where change_id=1974;
Query OK, 1 row affected (0.05 sec)
Rows matched: 1  Changed: 1  Warnings: 0

 

OK,現在neutron的提交已經恢復正常,我可以安心地去做其他事情了:)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM