У меня есть проект, состоящий из множества подмодулей. Однако некоторые из этих подмодулей задним числом не должны быть подмодулями, поскольку они не предназначены или когда-либо будут использоваться в другом проекте, и я иногда передаю код между ними. Этот проект удвоился как эксперимент с подмодулями, поэтому я немного сошел с ума.
Мне было интересно, есть ли способ преобразовать подмодули в обычные каталоги, сохранив историю изменений, но переписав историю основного проекта, чтобы они обрабатывались как обычные каталоги.
Я видел материал о слиянии поддеревьев, но я надеялся найти способ переписать коммиты, чтобы пути к файлам имели префикс подмодуля.
У меня нет большого опыта работы с подмодулями, но я бы сделал следующее:
Возможно, это не лучший подход, но я бы так поступил, если бы хотел включить в свой проект другой проект, сохраняя при этом отдельные вещи.
** Это вообще возможно? Мне определенно нужно получить больше практического опыта работы с субмодулями и тому подобным.
git subtree
довольно просто использовать, если вы просто хотите сохранить историю отдельной ветки для каждого подмодуля:
git fetch <path/to/submodule> HEAD
git rm <path/to/submodule>
git commit -m "Prepare to integrate Git submodules' history into repository"
git subtree add --prefix=<path/to/submodule> FETCH_HEAD
Это объединит историю текущей проверенной ревизии подмодуля. Убедитесь, что вы были в чистом состоянии перед запуском, например, git submodule update
и дважды проверьте с помощью git status
.
Вы получите две фиксации: первая удаляет подмодуль, вторая интегрирует предыдущую историю (теперь хранящуюся в FETCH_HEAD
) в репозиторий. Нет простого способа (по крайней мере, я не знаю об этом) сделать это с помощью "атомарной" фиксации. Для этого вам нужно будет поиграть с набором сантехнических команд Git.
Если вам нужно интегрировать историю нескольких подмодулей, я рекомендую поместить все операции удаления в первый коммит, а все операции интеграции - во второй. В этом случае вам нужно запомнить извлеченные HEADS каким-либо другим способом.
Примечание:
Хотя git subtree
находится внутри ./contrib
в вышестоящем Git, кажется, что он доступен (по крайней мере) в Debian с версии 1.9.1 (март 2014 г.).