2011-06-20 12 views
3

私はgit clone . /somedirectory/b.gitを使ってリポジトリBにリポジトリAをクローンしました。その後、B git submodule add /path/to/c.git c_in_bにサブモジュールリポジトリCを導入することにしました。だから、私はこのサブモジュールの追加をAにどのようにプッシュバックするのですか?git pushing submodule

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

このような 'non bare'リポジトリに入ることはできません。 http://stackoverflow.com/questions/3221859/cannot-push-into-git-repository – Dogbert

答えて

0

これは、サブモジュールが画像に含まれていない場合でも、gitのジェネラリ動作です。あなたは "作業リポジトリ"または "非裸"であるrepo(A)にプッシュしています。デフォルトではgitはそれを許可していないので、表示されるエラーメッセージに理由と回避策が示されます。あなたのケースでは

は、私が裸を使用し、エラーが提案するか、単にAの上に別のブランチをチェックアウトして、長期使用のためにBからプッシュして(warnまたはignoreとしてreceive.denyCurrentBranchを設定する)あなたはAで設定を更新することができると思いますプッシュするためのレポ。

3

を持っています。裸のレポジトリを最初にプッシュするようにします。クローンコマンドに--bareを追加するだけです。

この理由は、作業の損失を防ぐためです。作業ディレクトリを持つことは、ブランチが外部的に更新される場合、作業を失う可能性があることを意味します。

2

他の回答が指摘しているように、リポジトリと作業用コピーとの間に混乱があり、裸のリポジトリ(〜サーバー)としてのリポジトリがあるようです。

あなたの最善の策は、これらの2つを精神的に区別することです。作業コピーは、変更を実装し、コミットし、それらを「サーバーリポジトリ」にプッシュする場所です。サーバリポジトリは、プッシュしようとするときに見ることができるまさにその理由のために、通常は裸のリポジトリです。作業コピーには、作業コピー内の根本的な.gitディレクトリを変更することで荒廃する変更が含まれている可能性があります。

これを修正する最も簡単な方法は、リモートリポジトリを「サーバーリポジトリ」、つまり変更を保持したままのリポジトリに向けることが最も一般的です。まだサーバーリポジトリを持っていない場合は、モジュール用に作成することをお勧めします。その後、サブモジュールとトップレポの両方に対して

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

のいずれかを実行できます。

関連する問題