web-dev-qa-db-ja.com

Gitサブモジュールプッシュ

サブモジュールを変更した場合、コミットをサブモジュールのオリジンにプッシュバックできますか、それともクローンが必要ですか?クローンの場合、別のリポジトリ内にクローンを保存できますか?

109
webjay

サブモジュールは、追加のメタデータ(gitlinkツリーエントリ、.gitmodulesファイル)を含む別のリポジトリ内のgitリポジトリのクローンにすぎません

$ cd your_submodule
$ git checkout master
<hack,edit>
$ git commit -a -m "commit in submodule"
$ git Push
$ cd ..
$ git add your_submodule
$ git commit -m "Updated submodule"
117
manojlds

Git1.7.11( [ANNOUNCE] Git 1.7.11.rc1 および release note 、2012年6月)が言及していることに注意してください。

git Push --recurse-submodules」は、スーパープロジェクトにバインドされたサブモジュールの履歴をオプションで調べ、それらをプッシュすることを学びました。

this patch および--on-demandオプションの後に行われた可能性があります。

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

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

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

だから、あなたはすべてを一度に(親リポジトリから)プッシュすることができます:

git Push --recurse-submodules=on-demand

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


Git 2.7(2016年1月)では、単純なgit Pushで、親リポジトリをプッシュし、allそのサブモジュールをプッシュできます。

commit d34141ccommit f5c7cd9 (2015年12月3日)、 commit f5c7cd9 (03 Dec 2015)、および commit b33a15b (2015年11月17日)by Mike Crowe(mikecrowe
Jumio C Hamano-gitster- in commit 5d35d72 、2015年12月21日)

PushrecurseSubmodules configオプションを追加

--recurse-submodulesコマンドラインパラメーターはしばらく存在していましたが、同等の構成ファイルはありません。

git fetchの対応するパラメーターのスタイルに従って、このパラメーターのデフォルトを提供するPush.recurseSubmodulesを発明しましょう。
これには、必要に応じてコマンドラインで設定を上書きできるようにするために、--recurse-submodules=noを追加する必要もあります。

これを実装する最も簡単な方法は、Pushfetchと同様の方法でsubmodule-configのコードを使用することです。

git config docにinclude が追加されました。

Push.recurseSubmodules

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

  • 値が「check」の場合、Gitは、プッシュされるリビジョンで変更されたすべてのサブモジュールコミットが、サブモジュールの少なくとも1つのリモートで利用可能であることを確認します。コミットが欠落している場合、プッシュは中止され、ゼロ以外のステータスで終了します。
  • 値が 'on-demand'の場合、プッシュされるリビジョンで変更されたすべてのサブモジュールがプッシュされます。オンデマンドが必要なすべてのリビジョンをプッシュできなかった場合、それも中止され、ゼロ以外のステータスで終了します。 -
  • 値が「no」の場合、プッシュ時にサブモジュールを無視するデフォルトの動作が保持されます。

--recurse-submodules=check|on-demand|no」を指定することにより、プッシュ時にこの設定をオーバーライドできます。

そう:

git config Push.recurseSubmodules on-demand
git Push

Git 2.12(2017年第1四半期)

git Push --dry-run --recurse-submodules=on-demandは実際に動作します。

commit 0301c82commit 1aa7365 (2016年11月17日)by Brandon Williams(mbrandonw
C浜野順夫-gitster- in commit 12cf113 、2016年12月16日)

Push run with --dry-runは、Pushがサブモジュールをオンデマンドでプッシュするように構成されている場合、実際には(Git 2.11 2016年12月以前およびそれ以前)ドライドライを実行しません。
代わりに、プッシュする必要があるすべてのサブモジュールは実際にリモートにプッシュされますが、スーパープロジェクトの更新はドライランとして実行されます。
これはバグであり、ドライランの意図した動作ではありません。

サブモジュールを「オンデマンド」でプッシュするように構成されている場合は、Push--dry-runオプションを尊重するように指示します。
これは、--dry-runフラグを子プロセスに渡すことで実行されます。子プロセスは、ドライランを実行するときにサブモジュールのプッシュを実行します。


また、Git 2.12では、「--recurse-submodules=only」オプションtoがあり、最上位のスーパープロジェクトをプッシュせずにサブモジュールをプッシュします

commit 225e8bfcommit 6c656c3commit 14c01bd (2016年12月19日)を ブランドンウィリアムズ(mbrandonw
Jumio C Hamano-gitster- in commit 792e22e 、2017年1月31日)

98
VonC