Git переписать с помощью подмодулей, поглощать файлы подмодулей при каждом коммите?

Я хочу сделать что-то более сложное, чем un-submodule a git submodule

У меня есть репозиторий git верхнего уровня, который содержит репозитории подмодулей.

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

Это также можно описать как обратное Преобразование папки git в подмодуль задним числом?

Например,

Репозиторий подмодулей имеет историю

A--B--C--D

Топ репо имеет историю

X--Y--Z
where
X[points to A]--Y[points to B]--Z[points to D]

Наивное решение, описанное в другом вопросе, приведет к:

A--B--C--D
          \
           > M
          / 
   X--Y--Z

Вместо этого я хотел бы:

X'--Y'--Z'
where:
X' is X plus the files from A
Y' is Y plus the files from B
Z' is Z plus the files from D'

Обращение к комментарию пользователя torek. Обратите внимание, что фиксация C потеряна, а фиксация D' содержит все изменения из коммитов C и D. Это сделано не по выбору, а для упрощения. Я также был бы счастлив, если бы фиксация C' (изменения из C) просто появлялась между Y' и Z', к сожалению, это приводит к другим пограничным случаям, которые не стоит решать.

Что я уже пробовал?

Потратил некоторое время, пытаясь сформулировать, что я хочу сделать, и исследуя существующие вопросы SO.

Это проблема XY?

Нет, это не так. Это не часть какой-то более крупной проблемы, которую я на самом деле пытаюсь решить.


git
person Alex R    schedule 21.09.2019    source источник
comment
Стоит отметить: если суперпроект имеет, скажем, 3 уникальных gitlinks на подмодуль, но сам подмодуль имеет более 3 коммитов, вы почти наверняка пропустите все коммиты субмодуля, кроме трех, в переписанном, де-субмодульном суперпроекте. Если вы хотите избежать этого, у вас будет гораздо более сложная проблема, поскольку нет гарантии, что граф фиксации суперпроекта и граф фиксации подмодуля соответствуют друг другу.   -  person torek    schedule 21.09.2019
comment
Да, хороший улов. Я обновил вопрос, чтобы показать потерянную фиксацию из репозитория подмодуля.   -  person Alex R    schedule 21.09.2019


Ответы (1)


Подмодуль - это (совершенно обычный) репозиторий, если вы хотите прочитать что-то из его коммитов, вы можете добавить его объект db в свой поиск.

GIT_ALTERNATE_OBJECT_DIRECTORIES=$PWD/.git/modules/mysubmodule/objects \
git filter-branch --index-filter '
        if subcommit=`git rev-parse -q --verify :path/to/submodule`; then
                git update-index --force-remove path/to/submodule
                git read-tree --prefix=path/to/submodule/ $subcommit
        fi
' -- --all
GIT_ALTERNATE_OBJECT_DIRECTORIES=$PWD/.git/modules/mysubmodule/objects \
git repack -ad

должен сделать это.

person jthill    schedule 21.09.2019
comment
Кажется, что git rev-parse терпит неудачу при выполнении внутри фильтра. Нет сообщения об ошибке, просто ненулевой код выхода :-( - person Alex R; 21.09.2019
comment
Удалив опцию -q, я получаю... fatal: Needed a single revision tree filter failed: git rev-parse --verify :***, где *** — путь к подмодулю. Когда я меняю его обратно на index-filter, ошибка та же самая. - person Alex R; 21.09.2019
comment
Исправлено его поведение, когда путь/к/подмодулю не существует, извините за упс. а откуда у вас древесный фильтр? это индексный фильтр. А, я вижу, ты просто пытался это сделать. - person jthill; 21.09.2019
comment
Да, извините, я изменил индексный фильтр на древовидный во время отладки. Теперь вернемся к индексному фильтру. - person Alex R; 21.09.2019
comment
Ошибка на полпути failed to unpack tree object... Я думаю, что в какой-то момент истории подмодуля была удаленная фиксация. - person Alex R; 21.09.2019
comment
Если на этом пути когда-либо было не-фиксация, вам придется добавить еще немного к фильтру, чтобы справиться с этим, например. добавить && [[ `git cat-file -t $subcommit` = commit ]] к тесту. - person jthill; 21.09.2019
comment
Теперь я пропускаю ошибки, мне просто нужно выяснить, как удалить эти плохие коммиты из истории. - person Alex R; 21.09.2019