2016-12-15 40 views
1

通常Git死不推到一個正常的,非--bare庫的(單)當前簽出的分支:爲什麼Git允許推送到附加工作樹中的簽出分支?我應該如何恢復?

$ git push upstream master 
Counting objects: 1, done. 
Writing objects: 100% (1/1), 188 bytes | 0 bytes/s, done. 
Total 1 (delta 0), reused 0 (delta 0) 
remote: error: refusing to update checked out branch: refs/heads/master 
remote: error: By default, updating the current branch in a non-bare repository 
remote: error: is denied, because ... 

這是正確的行爲。Git push error '[remote rejected] master -> master (branch is currently checked out)'

但是,在那個完全相同的上游,我有一個額外的worktree檢出了一個不同的分支。就在上面的錯誤示範之前,我跑:

$ git push upstream pytest 

它成功,當清楚它不應該有,出於同樣的原因master這裏失敗。特別是,receive.denyCurrentBranch確實設置爲拒絕當前分支。

在上游系統,git worktree list說:

$ git worktree list 
<path1>  9febb4c [master] 
<path2>  406bef8 [pytest] 

這表明至少部分的Git知道它的取出。但它然後允許無論如何推,這導致了兩個問題:

  1. 這是一個錯誤?

  2. 既然我處在這個爛攤子裏,我該如何恢復?

(附註:我只是不小心絆倒在此同時使用二次加工樹,所以我記錄它爲後人因此,我將張貼我自己的答案。)

+0

如果你不能回答這個問題,你真的認爲別人能夠嗎?那麼,有一個人[可能](http://stackoverflow.com/users/6309/vonc)。 –

+0

@TimBiegeleisen:的確如此。我只是爲了防止其他人在這個問題上磕磕絆絆。 – torek

回答

1
  1. 是,它顯然是一個bug:在接收包代碼中,Git的「這是一個當前分支」測試正在使用pre-multiple-work-trees測試,它只是檢查主工作樹的HEAD。它需要進行修改,以與git worktree list相同的方式檢查所有工作樹。

    (我正在通過VPN只有其中一人有在目前運行的服務器連接的兩個系統,所以我在這裏使用非對稱獲取/推模式。)

  2. 幸運的是,我沒有提交的工作,所以恢復是微不足道的:在二次加工樹(分支pytest),只需要運行:

    git reset --hard HEAD 
    

    其清理指標和工作樹兩種。

    但是,如果我不是,最簡單的技巧是強制一個新的分支存在於分支的前一個值,然後檢查該分支。這可以在一個步驟中完成:

    git checkout -b tempbranch [email protected]{1} 
    

    工作樹現在是在不同的(預push)分支,在那裏的臨時工作,現在可以提交或藏匿或重訂基期或什麼,並處理了通常的方式。

相關問題