Переключение URL субмодуля с различными результатами фиксации в «не дереве» - PullRequest
1 голос
/ 22 мая 2019

Мне нужно переключить подмодуль проекта с тем, который я создал.Новый субмодуль находится в моем репо.

  1. Я разветвил основной репо проекта.
  2. Я изменил файл .gitmodules с URL нового субмодуля репо (мой репо).
  3. Я сделал git submodule sync.
  4. Я сделал git submodule init.
  5. Я сделал git submodule update --recusrsive.

Работал файлдля всех подмодулей, не измененных, но для подмодуля, который я изменил, он возвращает:

fatal: reference is not a tree: 3062d287c322fabf1b41b8e33518eb449d4ac6ed

Это потому, что основной репозиторий уже указывает на коммит 3062d287c322fabf1b41b8e33518eb449d4ac6ed исходного подмодуля, но в моем подмодуле естьне такой коммит.

Где хранится этот указатель фиксации и почему субмодуль работает так?Как я могу это исправить?

1 Ответ

2 голосов
/ 22 мая 2019

Где хранится указатель фиксации ...

Есть две копии:

  • Один постоянно замораживается в коммите в суперпроекте. То есть сам коммит суперпроекта говорит каждому, кто читает коммит: Этот коммит должен использоваться с коммодом субмодуля 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 в вашем индексе, но описанный выше метод, пожалуй, самый простой, поскольку вы можете точно видеть, что вы делаете.

...