Преобразовать подмодуль git в обычный каталог и сохранить историю в основном дереве?

У меня есть проект, состоящий из множества подмодулей. Однако некоторые из этих подмодулей задним числом не должны быть подмодулями, поскольку они не предназначены или когда-либо будут использоваться в другом проекте, и я иногда передаю код между ними. Этот проект удвоился как эксперимент с подмодулями, поэтому я немного сошел с ума.

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

Я видел материал о слиянии поддеревьев, но я надеялся найти способ переписать коммиты, чтобы пути к файлам имели префикс подмодуля.

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
3
0
1 672
2

Ответы 2

У меня нет большого опыта работы с подмодулями, но я бы сделал следующее:

  • удалить подмодуль из проекта **. Добавьте репозиторий «исходный подмодуль» в качестве удаленного для вашего проекта и извлеките.
  • Слейте любую ветку, которую хотите перенести в свой проект. Если бы я хотел разместить файлы из этого другого проекта в отдельном каталоге моего основного проекта, я бы, вероятно, проверил ветку подмодуля (больше не подмодуль, теперь это настоящая удаленная ветка), переименуйте файлы там в каталог, который я имею в виду (чтобы он не конфликтовал ни с чем из основного проекта), тогда я бы объединил эту новую ревизию в свой основной проект.

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

** Это вообще возможно? Мне определенно нужно получить больше практического опыта работы с субмодулями и тому подобным.

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 г.).

Другие вопросы по теме