サブモジュールのリポジトリに使用したいコミットが含まれていると(スーパープロジェクトの現在の状態から参照されるコミットとは異なり)、それを行うには2つの方法があります。
1つ目は、使用するサブモジュールからのコミットをすでに知っている必要があります。サブモジュールを直接調整してスーパープロジェクトを更新することにより、「内部、外部」から機能します。2番目は、サブモジュールを変更したスーパープロジェクトのコミットを見つけ、別のサブモジュールコミットを参照するようにスーパープロジェクトのインデックスをリセットすることにより、「外部から」の作業を行います。
内側、外側
あなたはすでにあなたが使用するサブモジュールを表示したいコミットわかっている場合、cd
サブモジュールに、必要なコミットをチェックアウトし、git add
そしてgit commit
それは、スーパープロジェクトにバックします。
例:
$ git submodule update
fatal: reference is not a tree: e47c0a16d5909d8cb3db47c81896b8b885ae1556
Unable to checkout 'e47c0a16d5909d8cb3db47c81896b8b885ae1556' in submodule path 'sub'
おっと、誰かがサブモジュールの非公開のコミットを参照するスーパープロジェクトコミットを作成しましたsub
。どういうわけか、サブモジュールをcommitしたいことはすでにわかってい5d5a3ee314476701a20f2c6ec4a53f88d651df6c
ます。そこに行って、直接チェックしてください。
サブモジュールでのチェックアウト
$ cd sub
$ git checkout 5d5a3ee314476701a20f2c6ec4a53f88d651df6c
Note: moving to '5d5a3ee314476701a20f2c6ec4a53f88d651df6c' which isn't a local branch
If you want to create a new branch from this checkout, you may do so
(now or later) by using -b with the checkout command again. Example:
git checkout -b <new_branch_name>
HEAD is now at 5d5a3ee... quux
$ cd ..
コミットをチェックアウトしているので、サブモジュールに分離されたHEADが生成されます。サブモジュールがブランチを使用していることを確認したい場合は、を使用git checkout -b newbranch <commit>
して、コミット時にブランチを作成およびチェックアウトするか、必要なブランチ(たとえば、目的のコミットが先端にあるブランチ)をチェックアウトします。
スーパープロジェクトを更新する
サブモジュールでのチェックアウトは、作業ツリーへの変更としてスーパープロジェクトに反映されます。したがって、スーパープロジェクトのインデックスの変更を段階的に行い、結果を確認する必要があります。
$ git add sub
結果を確認する
$ git submodule update
$ git diff
$ git diff --cached
diff --git c/sub i/sub
index e47c0a1..5d5a3ee 160000
--- c/sub
+++ i/sub
@@ -1 +1 @@
-Subproject commit e47c0a16d5909d8cb3db47c81896b8b885ae1556
+Subproject commit 5d5a3ee314476701a20f2c6ec4a53f88d651df6c
サブモジュールはすでに指定されたコミットにあるため、サブモジュールの更新はサイレントでした。最初のdiffは、インデックスとワークツリーが同じであることを示しています。3番目の差分は、段階的な変更がsub
サブモジュールを別のコミットに移動することだけであることを示しています。
コミット
git commit
これにより、修正されたサブモジュールエントリがコミットされます。
外で
サブモジュールからどのコミットを使用すればよいかわからない場合は、スーパープロジェクトの履歴を確認してください。スーパープロジェクトから直接リセットを管理することもできます。
$ git submodule update
fatal: reference is not a tree: e47c0a16d5909d8cb3db47c81896b8b885ae1556
Unable to checkout 'e47c0a16d5909d8cb3db47c81896b8b885ae1556' in submodule path 'sub'
これは上記と同じ状況です。しかし、今回はサブモジュールに浸るのではなく、スーパープロジェクトからの修正に焦点を当てます。
スーパープロジェクトのエラントコミットを見つける
$ git log --oneline -p -- sub
ce5d37c local change in sub
diff --git a/sub b/sub
index 5d5a3ee..e47c0a1 160000
--- a/sub
+++ b/sub
@@ -1 +1 @@
-Subproject commit 5d5a3ee314476701a20f2c6ec4a53f88d651df6c
+Subproject commit e47c0a16d5909d8cb3db47c81896b8b885ae1556
bca4663 added sub
diff --git a/sub b/sub
new file mode 160000
index 0000000..5d5a3ee
--- /dev/null
+++ b/sub
@@ -0,0 +1 @@
+Subproject commit 5d5a3ee314476701a20f2c6ec4a53f88d651df6c
OK、問題が発生したようです。ce5d37c
サブモジュールを親(ce5d37c~
)から復元します。
あるいは、パッチテキスト(5d5a3ee314476701a20f2c6ec4a53f88d651df6c
)からサブモジュールのコミットを取得し、代わりに上記の「内部、外部」プロセスを使用できます。
スーパープロジェクトでのチェックアウト
$ git checkout ce5d37c~ -- sub
これにより、サブプロジェクトのエントリが、スーパープロジェクトのsub
コミット時の状態にリセットされましたce5d37c~
。
サブモジュールを更新する
$ git submodule update
Submodule path 'sub': checked out '5d5a3ee314476701a20f2c6ec4a53f88d651df6c'
サブモジュールの更新はOKになりました(ヘッドが切り離されていることを示しています)。
結果を確認する
$ git diff ce5d37c~ -- sub
$ git diff
$ git diff --cached
diff --git c/sub i/sub
index e47c0a1..5d5a3ee 160000
--- c/sub
+++ i/sub
@@ -1 +1 @@
-Subproject commit e47c0a16d5909d8cb3db47c81896b8b885ae1556
+Subproject commit 5d5a3ee314476701a20f2c6ec4a53f88d651df6c
最初の差分は、それsub
がでも同じであることを示していce5d37c~
ます。2番目のdiffは、インデックスとワークツリーが同じであることを示しています。3番目の差分は、段階的な変更がsub
サブモジュールを別のコミットに移動することだけであることを示しています。
コミット
git commit
これにより、修正されたサブモジュールエントリがコミットされます。