web-dev-qa-db-ja.com

gitサブモジュールの変更を「コミット」するにはどうすればいいですか?

私は、私の素朴さから、gitサブモジュールを設定し、それをSubversionの外部モジュールのように扱ってきました。

サブモジュールの変更を上流のリポジトリにコミット/プッシュする簡単な方法はありますか?そして、このようにして別々の(しかしリンクされた)リポジトリで同時開発を行うためにGitで推奨される手法は何ですか?

223
Dylan Beattie

サブモジュールは独自のリポジトリ/作業領域で、独自の.gitディレクトリがあります。

それで、最初にあなたのサブモジュールの変更をコミット/プッシュしてください:

$ cd path/to/submodule
$ git add <stuff>
$ git commit -m "comment"
$ git Push

それからあなたのメインプロジェクトに更新されたバージョンを追跡するように伝えます:

$ cd /main/project
$ git add path/to/submodule
$ git commit -m "updated my submodule"
$ git Push
353
timdev

さまざまなサブモジュールでたくさんの変更をコミットした場合は、(またはすぐにできるようになるでしょう)すべてを一度にプッシュする(つまりone親リポジトリからプッシュします。

git Push --recurse-submodules=on-demand

git1.7.11( [ANNOUNCE] Git 1.7.11.rc1 )の言及:

"git Push --recurse-submodules"は、スーパープロジェクトにバインドされたサブモジュールの履歴を任意に調べ、それらを押し出すことを学びました。

このパッチ--on-demandオプションの後におそらく行われます。

--recurse-submodules=<check|on-demand|no>::

プッシュされるリビジョンによって使用されるすべてのサブモジュールコミットがリモートトラッキングブランチで利用可能であることを確認してください。

  • checkが使用されている場合、プッシュされるリビジョンで変更されたすべてのサブモジュールコミットがリモートで利用可能であることがチェックされます。
    そうでない場合、プッシュは中止され、ゼロ以外のステータスで終了します。
  • on-demandが使用されている場合、プッシュされるリビジョンで変更されたすべてのサブモジュールがプッシュされます。
    オンデマンドで必要なすべてのリビジョンをプッシュできなかった場合も、中止され、ゼロ以外のステータスで終了します。

このオプションは1レベルのネストに対してのみ機能します。別のサブモジュール内のサブモジュールに対する変更はプッシュされません。

51
VonC
$ git submodule status --recursive

このような状況でも命の恩人です。あなたのsha1を追跡し、あなたのサブモジュールがあなたが彼らが思っているものを指していることを確かめるためにそれとgitk --allを使うことができます。

7
rahvin_t

サブモジュールは通常のリポジトリとまったく同じように扱うことができます。変更を上流に伝播するには、通常そのディレクトリ内でコミットするようにコミットしてプッシュするだけです。

5
nickgrim

コミットしてプッシュする前に、サブモジュールの作業用リポジトリツリーを起動する必要があります。私はカメを使っていて、次のことをしています:

まず、(ディレクトリではなく).gitファイルが存在するかどうかを確認してください。

  • そのようなファイルがある場合、それはスーパーモジュールgitディレクトリへのパスを含みます
  • このファイルを削除
  • initをgitする
  • サブモジュールに使用されるリモートパスを追加する
  • 以下の指示に従ってください

.gitファイルがあれば、ローカルツリーを追跡する.gitディレクトリがあったはずです。あなたはまだブランチ(あなたはそれを作成することができます)またはマスターに切り替える(時にはうまくいかない)必要があります。最善の方法は - git fetch - git pullです。取得を省略しないでください。

今すぐあなたのコミットとプルはあなたのオリジン/マスターと同期されます

2
fantastory