2016-06-13 11 views
1

私は、多くのサブモジュールを持つ作業現場で大きな既存のレポを扱っています。なぜそれがそのコミット選ぶん:私はgitはどのようにサブモジュールでチェックアウトするコミットを選択しますか?

git submodule update --checkout 

を行う際にいくつかのモジュールは、特定のコミット(分岐のないヘッド)

git submodule update --checkout --force 
Submodule path 'build/cmake': checked out '8ed3354a70974ec775eee94cdce57810deeda65f' 

私の質問があり、チェックアウトは気づきましたか?

私の.gitmodulesはコミットまたはブランチを指定せず、.git/configも指定しません。

+0

詳細情報:コミットは特定のブランチを参照していますが、私は設定ファイルで追跡していません。 – Ben

+0

*すべての*サブモジュールは、特定のコミットをIDで指定します。これはGitのサブモジュールの性質です。 IDは実際のコミットに記録されます。スーパープロジェクトが 'master'ブランチ上にあり、' master'が現在 'a1234567'をコミットしている場合、Gitは' a1234567:build/cmake'を調べます。これは "gitlink"タイプのツリーエントリで、 '8ed335 ...'それはサブモジュール内でチェックアウトされるコミットです(分離されたHEADとして)。 – torek

答えて

1

現在のリポジトリ内のサブモジュールの参照は、サブモジュールと特定のコミットの両方に適用されます。コミットSHAはインデックスに格納されます。

サブモジュールHEADがコミットしているものを変更する場合は、親リポジトリに保留中の変更が表示されます。その変更と異なるのであれば、サブモジュールによって参照されるコミットが異なり、サブモジュールの違いはありません。

cd submodule git reset --hard HEAD~4 cd .. git status

サブモジュールが使用する痛みの一種である理由は、実際にある -Subproject commit <old submodule HEAD SHA> +Subproject commit <SHA of 4 commits before old HEAD>

が得られます。ブランチに従うか、特定のタグであるかを指定することはできません。サブモジュールを変更してそこにプッシュする必要がある場合は、親リポジトリをコミットしてプッシュして、参照されたSHAを更新します。サブモジュールをプッシュするのを忘れても、親を押すと、サブモジュールを更新しようとすると他の人にエラーが発生します。サブモジュールコミットを親に更新するために変更をコミットするのを忘れた場合、他の誰もあなたの変更をそのサブモジュールに引き寄せません。

関連する問題