Где хранится указатель фиксации ...
Есть две копии:
Один постоянно замораживается в коммите в суперпроекте. То есть сам коммит суперпроекта говорит каждому, кто читает коммит: Этот коммит должен использоваться с коммодом субмодуля 3062d287c322fabf1b41b8e33518eb449d4ac6ed
. Очевидно, что этот коммит работает в целом, только если коммит субмодуля 3062d287c322fabf1b41b8e33518eb449d4ac6ed
существует; но поскольку все коммиты полностью доступны только для чтения, этот коммит суперпроекта будет говорить об этом вечно (или до тех пор, пока коммит суперпроекта продолжает существовать). Поскольку вы не можете изменить его, вы можете не беспокоиться об этом.
Запись в вашем коммите суперпроекта называется gitlink .
Другая копия находится в вашем индексе . Вероятно, он попал туда, будучи скопированным из коммита в ваш индекс. Индекс также называется промежуточной областью , и эта индексная / промежуточная область содержит копию каждого файла из фиксации. То есть вы что-то сделали - возможно, запустили git checkout
- что приказало Git извлечь некоторый коммит суперпроекта. Этот суперпроектный коммит содержит много файлов, например, README.md
, .gitmodules
и так далее. Он также содержит запись gitlink о том, что подмодуль X должен делать git checkout 3062d287c322fabf1b41b8e33518eb449d4ac6ed
.
Когда Git извлекал все эти файлы (README.md
, .gitmodules
и т. Д.), Он копировал их в ваш индекс и в ваше рабочее дерево. Он также скопировал gitlink в ваш индекс. Таким образом, gitlink 3062d287c322fabf1b41b8e33518eb449d4ac6ed
теперь находится в вашем индексе под подмодулем, и git submodule update
войдет в подмодуль и запустит git checkout 3062d287c322fabf1b41b8e33518eb449d4ac6ed
.
Индекс gitlink - это то, что вам нужно изменить. Чтобы изменить его, введите подмодуль самостоятельно - вручную - и git checkout
фиксацию, которую вы хотите назвать своим индексом. Затем выйдите из подмодуля, вернувшись к суперпроекту, и запустите git add path/to/submodule
. Это скопирует хеш коммита, который извлечен в подмодуле, в запись gitlink в вашем индексе.
Поскольку Git делает все новые коммиты из того, что есть в индексе в то время, когда вы запускаете git commit
, вы теперь готовы сделать новый коммит, который будет много как и предыдущий коммит - у него те же README.md
и .gitmodules
и т. д. - за исключением того, что у него есть нужная вам ссылка gitlink вместо старой 3062d287c322fabf1b41b8e33518eb449d4ac6ed
. Конечно, вы можете git add
больше вещей, чтобы скопировать их из вашего рабочего дерева в ваш индекс перед фиксацией: например, возможно, вы изменили URL-адрес на .gitmodules
в своем рабочем дереве, который вы хотели бы поместить в новый коммит тоже.
Существуют и другие способы изменить gitlink в вашем индексе, но описанный выше метод, пожалуй, самый простой, поскольку вы можете точно видеть, что вы делаете.