web-dev-qa-db-ja.com

すべてのサブモジュールを含む古いgit commitを再帰的にチェックアウトする方法は?

複数のサブモジュールを持つgitリポジトリがあります。それらのサブモジュールの1つに、独自のサブモジュールが複数あります。私が探しているのは、マスターリポジトリの古いコミットをチェックアウトし、すべてのサブモジュールから適切なコミットをチェックアウトして、その時点でのコードの正しい状態を取得することだけです。

ls-treeコマンドは、各サブモジュールがオンになっていたコミットを通知するため、gitには必要な情報が含まれていることを知っています。ただし、それぞれを手動でチェックアウトする必要があるため、非常に時間がかかります。

git checkout --recursiveのようなものを探していますが、そのようなコマンドは存在しないようです。

とにかくこれを行うにはありますか?

27
Ben Baron

これを実現するには、2つのコマンドが必要です。

git checkout *oldcommit*
git submodule update --recursive

更新:この回答は2018年の時点で古くなっています。詳細については、以下の VonCの回答 を参照してください。

30
Chronial

注:複数のサブモジュール(およびサブモジュール内のサブモジュール)がある場合は、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

どのサブモジュールに問題があるかについてのヒントを与えます。

17
VonC

古いチェックアウトにさらにサブモジュールがあるかどうかに応じて、新しいコミットにそれ以上存在しないサブモジュールを初期化するには、以下を実行する必要がある場合があります。

git checkout *oldcommit*
git submodule init
git submodule update --recursive
7
Thomas