Как перебазировать подмодуль git, сохраняя ссылки на коммиты подмодуля из репозитория git, содержащего подмодуль?

(В настоящее время я исправляю свои старые репозитории перед публикацией.)

Я уже знаю, как переписать адрес электронной почты и имя автора фиксации в истории git.

У меня есть проект git с подмодулями. Я хочу переписать историю этих подмодулей, но поскольку я перематываю эти подмодули вперед во время разработки, я хочу изменить ссылки из основного репозитория git, указывающие на некоторые из этих подмодулей, фиксируются на ссылки, указывающие на новые фиксации после перебазирования подмодуля. т.е. Мне нужно перебазировать подмодуль git в сочетании с перебазированием репозитория git, содержащего этот подмодуль. (Извините за слишком длинный текст, не знаю, как описать короче.)

Как переписать историю подмодуля git синхронно с историей репозитория git, содержащей подмодуль?


person Vyacheslav Napadovsky    schedule 23.10.2016    source источник


Ответы (1)


Как я упоминал в "Репозиторий с подмодулями после перезаписи истории подмодуля", простого решения не существует.

Вам придется переписать историю вашего основного репо с помощью git filter-branch в поисках определенные коммиты, включая gitlink (специальная запись в указателе)

Сначала вам нужно установить соответствие между SHA1 старой истории подмодуля и gitlinks, используемыми вашим основным репо.

 cd /submodule/repo/just/rewritten/
 # the old history is still available in refs/original
 git -C /path/to/rewritten/repo for-each-ref --format="%(refname)" refs/original

 cd /main/repo
git for-each-ref --contains <SHA1> # SHA being a SHA1 from the old submodule history

Тогда вам нужно будет заменить

git filter-branch --prune-empty --tree-filter 'change_gitlink'

change_gitlink будет скриптом, который войдет в папку подмодуля (отсюда --tree-filter, а не --index-filter), проверит новый SHA1 (из новой истории подмодуля). Ветка фильтра зафиксирует новое состояние репо, включая новый gitlink (поскольку подмодуль был проверен в правильном новом SHA1).

person VonC    schedule 23.10.2016
comment
индексный фильтр с update-index --cacheinfo должен работать, не так ли? - person jthill; 23.10.2016
comment
@jthill возможно, да. Он должен разрешать проверку подмодуля. - person VonC; 23.10.2016