Якщо припустимо, що сховище підмодуля містить в собі команду, яку ви хочете використовувати (на відміну від комісії, на яку посилається поточний стан надпроекту), це можна зробити двома способами.
Перший вимагає, щоб ви вже знали фіксацію з підмодуля, який ви хочете використовувати. Він працює «зсередини, ззовні», безпосередньо підлаштовуючи підмодуль та оновлюючи суперпроект. Другий працює "ззовні, в", знаходячи комісію суперпроекту, яка змінила підмодуль, а потім повторно скидає індекс суперпроекту для позначення іншого підмодуля.
Навиворіт
Якщо ви вже знаєте , який ви хочете зробити подмодуль в використання, 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>
для створення та оформлення замовлення гілки на комітці або оформлення замовлення потрібної гілки (наприклад, з потрібною фіксацією на кінчику).
Оновіть проект Super
Оформлення замовлення в підмодулі відображається в надпроекті як зміна робочого дерева. Тому нам потрібно поетапно змінити індекс суперпроекту і перевірити результати.
$ 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
Оновлення підмодуля було беззвучним, оскільки підмодуль вже знаходиться у вказаній комісії. Перший розріз показує, що індекс і робоче дерево однакові. Третя різниця показує, що єдиною поетапною зміною є переміщення 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
Гаразд, схоже, що в ньому пішло погано ce5d37c
, тому ми відновимо підмодуль від його батьківського ( ce5d37c~
).
Крім того, ви можете взяти команду підмодуля з тексту виправлення ( 5d5a3ee314476701a20f2c6ec4a53f88d651df6c
) та використати вищезазначений процес "всередину, зовні".
Оформити замовлення в проекті Super
$ git checkout ce5d37c~ -- sub
Це скидає запис субмодуля sub
до того, що було зроблено на здійсненні ce5d37c~
в надпроекті.
Оновіть підмодуль
$ git submodule update
Submodule path 'sub': checked out '5d5a3ee314476701a20f2c6ec4a53f88d651df6c'
Оновлення підмодуля пішло нормально (воно вказує на відокремлену ГОЛОВУ).
Перевірте результати
$ 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~
. Друга різниця показує, що індекс і робоче дерево однакові. Третя різниця показує, що єдиною поетапною зміною є переміщення sub
підмодуля до іншого коміту.
Здійснити
git commit
Це робить фіксований запис субмодуля.