2013-02-27 11 views
14

私は複数のサブモジュールを持つgit repoを持っています。それらのサブモジュールの1つには、それ自身のサブモジュールが複数あります。私が探しているのは、マスタリポジトリの古いコミットをチェックアウトし、その時点でコードの正しい状態を取得するために、すべてのサブモジュールから適切なコミットをチェックアウトすることです。すべてのサブモジュールを含む古いgit commitを再帰的にチェックアウトするにはどうすればいいですか?

ls-treeコマンドがそれぞれのサブモジュールがどのコミットをコミットしているかを知ることができるので、gitに必要な情報が含まれていることは知っています。しかし、私は手動でそれぞれをチェックアウトする必要がありますが、これは辛抱強く時間がかかります。

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

どうすればよいですか?

+0

注:現在、git checkout --recurse-submodulesが実際に存在します(2017)。しかし、今後のGit 2.14だけが適切に動作します。 [私の答えは以下](https://stackoverflow.com/a/44249558/6309)を参照してください。 – VonC

答えて

17

あなたがこれを達成するために2つのコマンドが必要になります。

git checkout *oldcommit* 
git submodule update --recursive 
+1

ありがとう!もちろん、それは単純なものであることが判明しました。 –

4

より多くのサブモジュールは、古いレジに存在するか否かに応じて、あなたがそこに任意のより多くのではないサブモジュールを初期化するために、次の操作を実行する必要があるかもしれませんが新しいコミット:

git checkout *oldcommit* 
git submodule init 
git submodule update --recursive 
6

注意:複数のサブモジュール(およびサブモジュール内部のサブモジュール)を持っている場合は、Gitの2.14(Q3 2017)

(2013年からOPより多くの最近の)に役立ちます
git checkout --recurse-submodules 

--recurse-submodulesを使用すると、スーパープロジェクトに記録されたコミットに従って、初期化されたすべてのサブモジュールの内容が更新されます。
サブモジュールのローカル修正が上書きされる場合は、-fを使用しない限りチェックアウトに失敗します。

git checkout --recurse-submodules

は、自身がサブモジュールを持っていることを サブモジュールでなく、かなりの仕事をしてくれました。これはGit 2.14と同じです。

+0

なぜ '-f'がいつも必要なのか分かりません。 '-f'を指定しないと、サブモジュールは更新されません。 – linquize

+0

@linquize '-f'は、サブモジュールにローカルな変更がある場合にのみ必要です。 – VonC

関連する問題