2011-06-20 173 views
3

我使用git clone . /somedirectory/b.git將存儲庫A克隆到存儲庫B.稍後,我決定在B git submodule add /path/to/c.git c_in_b中對模塊庫C進行子模塊化。那麼,我如何將這個子模塊添加到A?git推子模塊

使用git push,但有以下錯誤

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 it will make the index and work tree inconsistent 
remote: error: with what you pushed, and will require 'git reset --hard' to match 
remote: error: the work tree to HEAD. 
remote: error: 
remote: error: You can set 'receive.denyCurrentBranch' configuration variable t 
remote: error: 'ignore' or 'warn' in the remote repository to allow pushing int 
remote: error: its current branch; however, this is not recommended unless you 
remote: error: arranged to update its work tree to match what you pushed in som 
remote: error: other way. 
remote: error: 
remote: error: To squelch this message and still keep the default behaviour, se 
remote: error: 'receive.denyCurrentBranch' configuration variable to 'refuse'. 
+1

你不能像這樣推入一個「非裸」存儲庫。 http://stackoverflow.com/questions/3221859/cannot-push-into-git-repository – Dogbert

回答

0

即使子模塊不在圖片中,這也是git的基因實際行爲。您正在推動一個回購(A),這是一個「正在運行的存儲庫」或「非裸」,git默認情況下不允許您這樣做,並且您看到的錯誤消息顯示了原因和解決方法。

在你的情況,我想你可以更新A中的配置(設定receive.denyCurrentBranchwarnignore)的錯誤提示,或只是簽上另一個分支,然後從B.推動長期使用,使用裸推銷回購。

3

這是因爲你試圖推到非純倉庫嘗試。首先製作裸倉庫。只需將--bare添加到clone命令。

發生這種情況的原因是爲了防止失去工作。有一個工作目錄意味着如果一個分支要在外部更新,你可能會失去工作。

2

像其他答案指出的那樣,作爲工作副本的存儲庫和作爲裸存儲庫(〜服務器)的存儲庫似乎有些混淆。

最好的辦法是從心理上區分這兩個。工作副本是您實施更改,提交併將其推送到「服務器存儲庫」的地方。正因爲您嘗試推送時可以看到的原因,服務器存儲庫通常是裸露的存儲庫。工作副本可能包含更改,這些更改會通過修改工作副本中的基礎.git目錄而被破壞。

解決這個問題的最簡單方法很可能是將遠程存儲庫指向「服務器存儲庫」,即保存更改的裸存儲庫。如果您還沒有服務器回收站,則可能需要爲這些模塊創建它們。在此之後,你可以做

git remote rm origin 
git remote add origin ssh://[email protected]_repository 

爲子模塊和頂級回購。