複数のサブモジュールを持つgitリポジトリがあります。それらのサブモジュールの1つに、独自のサブモジュールが複数あります。私が探しているのは、マスターリポジトリの古いコミットをチェックアウトし、すべてのサブモジュールから適切なコミットをチェックアウトして、その時点でのコードの正しい状態を取得することだけです。
ls-tree
コマンドは、各サブモジュールがオンになっていたコミットを通知するため、gitには必要な情報が含まれていることを知っています。ただし、それぞれを手動でチェックアウトする必要があるため、非常に時間がかかります。
git checkout --recursive
のようなものを探していますが、そのようなコマンドは存在しないようです。
とにかくこれを行うにはありますか?
これを実現するには、2つのコマンドが必要です。
git checkout *oldcommit*
git submodule update --recursive
更新:この回答は2018年の時点で古くなっています。詳細については、以下の VonCの回答 を参照してください。
注:複数のサブモジュール(およびサブモジュール内のサブモジュール)がある場合は、Git 2.14(2017年第3四半期)が役立ちます(より最近では2013年のOP)
git checkout --recurse-submodules
--recurse-submodules
を使用すると、スーパープロジェクトに記録されたコミットに従って、初期化されたすべてのサブモジュールの内容が更新されます。
サブモジュールでのローカル変更が上書きされる場合、-f
を使用しないとチェックアウトは失敗します。
「git checkout --recurse-submodules
」は、それ自体にサブモジュールがあるサブモジュールではまったく機能しませんでした。 Git 2.14で対応します。
注:Git 2.19(2018年第3四半期)では、git checkout --recurse-submodules another-branch
の方が堅牢です。
以前は、作業ツリーの更新に失敗したサブモジュールが報告されなかったため、役に立たないエラーメッセージが表示されていました。
Stefan Beller(stefanbeller
) による commit ba95d4e (2018年6月20日)を参照してください。
( Junio C Hamano-gitster
- によってマージ commit 392b3dd 、2018年7月24日)
submodule.c
:エラーが発生したサブモジュールを報告します
submodule_move_head
のサブモジュールの作業ツリーの更新中にエラーが発生した場合は、ユーザーにエラーが発生したサブモジュールを通知します。
read-tree
の呼び出しにはスーパープレフィックスが含まれているため、read-tree
はパスに関連する問題を正しく報告しますが、一部のエラーメッセージにはパスが含まれていません。次に例を示します。~/gerrit$ git checkout --recurse-submodules Origin/master ~/gerrit$ fatal: failed to unpack tree object 07672f31880ba80300b38492df9d0acfcd6ee00a
どのサブモジュールに問題があるかについてのヒントを与えます。
古いチェックアウトにさらにサブモジュールがあるかどうかに応じて、新しいコミットにそれ以上存在しないサブモジュールを初期化するには、以下を実行する必要がある場合があります。
git checkout *oldcommit*
git submodule init
git submodule update --recursive