Gitはサブモジュールを再帰的に更新します


282

私のプロジェクト構造

ProjectA
-FrameworkA (submodule)
--Twig (submodule of FrameworkA)

サブモジュールを再帰的に更新するにはどうすればよいですか?私はすでにいくつかのgitコマンドを試しました(ProjectAルートで)

git submodule foreach git pull origin master

または

git submodule foreach --recursive git pull origin master

Twigのファイルはプルできません。


回答:


607
git submodule update --recursive

また、初期化されていないサブモジュールを初期化する--initオプションを使用することもできます。

git submodule update --init --recursive

注:Gitの一部の古いバージョンでは、この--initオプションを使用すると、初期化済みのサブモジュールが更新されない場合があります。その場合、--initオプションなしでコマンドを実行する必要もあります。


1
再帰的なサブモジュールの追加はどうですか?「git submodule add FrameworkA.git」はFrameworkAのファイルをプルするだけです。
12

2
「git submodule add blah」を実行してから、「git submodule update --init --recursive」を実行するだけです。
drewag 2012

これは以下の私の方法とは異なりますか?
William Entriken 2013

3
@Irineau --initが使用されている場合に更新されていない初期化済みのサブモジュールに関するメモは、Git 2.2.2での私の経験と一致しません。私が使用したときに正しいコミットがチェックアウトされてすでに初期化されているトップレベルとネストされたサブモジュールの両方が表示されます。git submodule update --init --recursiveコマンドを実行して、または実行せずにコマンドを実行する必要--initがあるという主張は単に間違っていると思います。誰かがこれが動作であることの証拠を示すか、バージョン間で変更されてかつては真実だったということを証明できない限り、私はそれを完全に編集する予定です。
Mark Amery 2015

3
@MarkAmery、これは私が覚えていないgitの一部のバージョンの問題であることを覚えています。1.9.3でテストしたところ、問題は発生していないようです。あいまいな「古いバージョン」を参照するように回答を更新しました。誰かがこの動作を変更したバージョンを指定できれば、それは素晴らしいことです。
drewag 2015

35

私の使い方は:

git submodule update --init --recursive
git submodule foreach --recursive git fetch
git submodule foreach git merge origin master

6
:私はへの最後の行を変更して働いていたgit submodule foreach git pull --ff-only origin master
ギラッドペレグ

2
また、最後の行に--recursiveを追加します: "git submodule foreach --recursive git merge origin master"さもなければ、それ自体がサブモジュールを更新したときにダーティサブモジュールを取得できます。
Michael Scott Cuthbert、2015年

過去3時間、これを探していました。ありがとうございます。これに追加するには、次のようなコミット用のコマンドを使用することもできますgit submodule foreach --recursive 'git commit -a | :':結果にかかわらず、それがループます。リンクstackoverflow.com/questions/19728933/…を参照してください。
駆け出しのピジョン2017年

17

サブモジュールのデフォルトのブランチがそうでない master場合があるので(私の場合はよく起こります)、これがGitサブモジュールの完全なアップグレードを自動化する方法です。

git submodule init
git submodule update
git submodule foreach 'git fetch origin; git checkout $(git rev-parse --abbrev-ref HEAD); git reset --hard origin/$(git rev-parse --abbrev-ref HEAD); git submodule update --recursive; git clean -dfx'

汎用的なMakefileにこのコマンドを追加しようとしましたが、単純な引用符で囲まれているにもかかわらず、GNU Make が$(...)シーケンスの解釈を無視するようにしています。誰かがアイデアを持っていますか?
Sebastien Varrette 2014年

あなたの命令は私が必要としていたものですありがとう!しかし、私は得ます: サブモジュールはEntering 'Core' fatal: ambiguous argument 'origin/HEAD': unknown revision or path not in the working tree.どこCore
ですか

また、このコメントを理解する必要があると思いますstackoverflow.com/a/18008139/3383543
Ahmad AlMughrabi 2017

再帰オプションがないということは、サブモジュールにサブモジュールが再び含まれない場合にのみ機能することを意味します。
erikbwork 2017年

15

最近のGit(私はv2.15.1を使用しています)では、以下は上流のサブモジュールの変更を再帰的にサブモジュールにマージします:

git submodule update --recursive --remote --merge

--init未初期化のサブモジュールを追加して初期化し--rebase、マージではなくリベースする場合に使用できます。

その後、変更をコミットする必要があります。

git add . && git commit -m 'Update submodules to latest revisions'

これ、私は何か間違ったことをしていると思いましたが、あなたの答えは私にもgit submodule update --remote my-dir/my-submodule同じように機能することを確認しました
iomv
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.