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


128

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


4
git 2.7(2016年1月)では、一度設定するだけで済みますgit config push.recurseSubmodules on-demand。その後、シンプルなものですべてgit pushをプッシュできます(メインのリポジトリとサブモジュール)。以下の私の編集した回答を参照しください。
VonC、2015

実行しようとしていることのサンプルコードを入力してください。
Ciro Santilli郝海东冠状病六四事件法轮功

回答:


138

サブモジュールは、追加のメタデータ(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"

1
はい。同期するローカルブランチ(存在する場合)から変更をプルしてからプッシュすることを忘れないでください。起こる。gh-pagesgithubリポジトリのドキュメントのブランチで作業する場合:)
NiKo

your_submoduleを追加する前に、your_submoduleをcdする方法がわかりません。サブモジュールを追加する最良の方法は、 "add" gitコマンドを使用することでした。それで、サブモジュールを追加する別の方法はありますか?
MrSo

1
@Mrだから、サブモジュールはすでにそこにあると思います、彼はサブモジュールの何かを変更するためにそれに固執しています。
HattrickNZ 2016年

108

git1.7.11([ANNOUNCE] Git 1.7.11.rc1 and release note、2012年6月)以降、次のように述べられています。

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

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

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

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

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

したがって、(親のリポジトリから)aを使用してすべてを一度にプッシュできます:

git push --recurse-submodules=on-demand

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


git 2.7(2016年1月)では、単純なgit pushで親リポジトリとそのすべてのサブモジュールをpushできます。

参照d34141cをコミットしf5c7cd9コミット、(2015年12月3日)をf5c7cd9をコミット(2015年12月3日)、およびb33a15bコミット(2015年11月17日)により、マイク・クロウ(mikecrowe
(合併によりJunio C浜野- gitster-5d35d72コミットし、2015年12月21日)を

pushrecurseSubmodules設定オプションを追加

--recurse-submodulesコマンドラインパラメータは、いくつかの時間のために存在しているが、それは何の設定ファイルと同等を持っていません。

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

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

git configドキュメントには、今が含ま

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 実際に動作します。

Brandon Williams(によるコミット0301c82コミット1aa7365(2016年11月17日)を参照してください。(合併によりJunio C浜野- -12cf113コミットし、2016年12月16日)をmbrandonw
gitster

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

サブモジュールを「オンデマンド」で再帰的にプッシュするように構成されている場合push--dry-runオプションを尊重するように教えます。
これは--dry-run、予行演習を実行するときにサブモジュールのプッシュを実行する子プロセスにフラグを渡すことによって行われます。


そしてGit 2.12でも、トップレベルのスーパープロジェクトをプッシュせずにサブモジュールをプッシュする " --recurse-submodules=only"オプションがあります。

Brandon Williams()によるcommit 225e8bfcommit 6c656c3commit 14c01bd(2016年12月19日)を参照してください。(合併によりJunio C浜野- -792e22eコミット 2017年1月31日)mbrandonw
gitster


これは今入手可能ですよね?
CMCDragonkai 2013年

@CMCDragonkaiはい、あります。git-scm.com/ docs / git-pushで確認できます。回答を編集しました。
VonC 2013年

再帰的なコミットはありますか?
CMCDragonkai 2014

1
いつでも 'git submodule foreach commit'を実行できます
reflog

.gitmodulesファイルをbitbucketのURLで更新する必要がありました。
wclark 2016
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.