サブモジュールのリポジトリに使用したいコミットが含まれていると仮定すると (スーパープロジェクトの現在の状態から参照されるコミットとは異なります)、それを行うには 2 つの方法があります。
最初の方法では、使用するサブモジュールからのコミットを既に知っている必要があります。サブモジュールを直接調整してからスーパープロジェクトを更新することにより、「内外」から機能します。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
。どういうわけか、サブモジュールをコミットしたいことはすでにわかってい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
サブモジュールはすでに指定されたコミットにあるため、サブモジュールの更新はサイレントでした。最初の差分は、インデックスと作業ツリーが同じであることを示しています。3 番目の diff は、ステージングされた唯一の変更が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'
サブモジュールの更新は正常に完了しました (HEAD が切り離されていることを示します)。
結果を確認する
$ 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
最初の diff はsub
、 で同じになっていることを示していce5d37c~
ます。2 番目の diff は、インデックスと作業ツリーが同じであることを示しています。3 番目の差分は、段階的な変更のみがsub
サブモジュールを別のコミットに移動していることを示しています。
専念
git commit
これにより、修正されたサブモジュール エントリがコミットされます。