Как мне удалить субмодуль подмодуля git (вернуть весь код обратно в ядро)?
Как в «как» я, как в «Лучшая процедура» ...
git
git-submodules
Quickredfox
источник
источник
git submodule deinit
, см. Мой ответ нижеgit submodule deinit asubmodule ; git rm asubmodule
, как показано в моем ответе нижеОтветы:
Если все, что вам нужно, это поместить свой код субмодуля в основной репозиторий, вам просто нужно удалить субмодуль и повторно добавить файлы в основной репозиторий:
Если вы также хотите сохранить историю подмодуля, вы можете сделать небольшую хитрость: «объединить» подмодуль с основным репозиторием, чтобы результат был таким же, как был раньше, за исключением того, что файлы подмодуля теперь находятся в основной репозиторий.
В основном модуле вам нужно будет сделать следующее:
Результирующий репозиторий будет выглядеть немного странно: будет более одного начального коммита. Но это не вызовет никаких проблем для мерзавца.
В этом втором решении вы получите большое преимущество, заключающееся в том, что вы можете запускать git blame или git log для файлов, которые изначально были в подмодулях. Фактически, вы сделали это для переименования множества файлов в одном репозитории, и git должен автоматически определить это. Если у вас все еще есть проблемы с git log, попробуйте некоторые опции (--follow, -M, -C), которые лучше обнаруживают переименование / копирование.
источник
git merge
гарантирует, что будет «предыдущий коммит» для каждого файла (на одной из двух «сторон» слияния).mkdir foo && git mv !(foo) foo && git commit
.--allow-unrelated-histories
чтобы заставить слияние при фальшивом слиянии, когда я получалfatal: refusing to merge unrelated histories
, больше здесь: github.com/git/git/blob/master/Documentation/RelNotes/…Начиная с git 1.8.5 (ноябрь 2013 ) ( без учета истории субмодуля ):
Что будет:
deinit
отсюдаmv
первый ),.gitmodules
для вас (rm
),rm
).Когда удаление субмодуля завершено (
deinit
иgit rm
), вы можете переименовать папку обратно в ее первоначальное имя и добавить ее в git repo как обычную папку.Примечание: если подмодуль был создан старой Git (<1.8), возможно , потребуется удалить вложенную
.git
папку внутри самого подмодуль, так прокомментировал на Саймона ВостокеЕсли вам нужно сохранить историю субмодуля см jsears «ы ответ , который использует
git filter-branch
.источник
deinit
один очистил рабочее дерево от вашего подмодуля?Я создал скрипт, который будет переводить подмодуль в простой каталог, сохраняя всю историю файлов. Он не страдает от
git log --follow <file>
проблем, от которых страдают другие решения. Это также очень простой однострочный вызов, который сделает всю работу за вас. G'luck.Он основан на превосходной работе Лукаса Йенса, описанной в его посте в блоге « Интеграция подмодуля в родительский репозиторий », но автоматизирует весь процесс и очищает несколько других угловых случаев.
Последний код будет поддерживаться с исправлениями ошибок на github по адресу https://github.com/jeremysears/scripts/blob/master/bin/git-submodule-rewrite , но для правильного протокола ответа stackoverflow я включил Решение во всей полноте ниже.
Применение:
ГИТ-подмодуль-переписать:
источник
curl https://raw.githubusercontent.com/jeremysears/scripts/master/bin/git-submodule-rewrite > git-submodule-rewrite.sh
и./git-submodule-rewrite.sh <submodule-name>
git rm --cached the_submodule_path
.gitmodules
файла, или, если это единственный подмодуль, удалите файл.git add the_submodule_path
Я не нашел более простой способ. Вы можете сжать 3-5 в один шаг
git commit -a
- вопрос вкуса.источник
.gitmodules
вместо.submodules
?.gitmodules
не.submodules
.git
каталог подмодуля, прежде чем онgit add
начнет работать с папкой подмодуляЗдесь много ответов, но все они кажутся слишком сложными и, вероятно, не делают то, что вы хотите. Я уверен, что большинство людей хотят сохранить свою историю.
В этом примере основным репо будет
git@site.com:main/main.git
и субмодуль репоgit@site.com:main/child.git
. Это предполагает, что подмодуль находится в корневом каталоге родительского репо. Отрегулируйте инструкции по мере необходимости.Начните с клонирования родительского репо и удаления старого субмодуля.
Теперь мы добавим дочерние репозитории в основной репозиторий.
Следующий шаг предполагает, что вы хотите переместить файлы в ветке подготовки к слиянию в то же место, что и субмодуль, который был выше, хотя вы можете легко изменить местоположение, изменив путь к файлу.
переместите все папки и файлы, кроме папки .git, в дочернюю папку.
Теперь вы можете просто объединить ваши файлы обратно в главную ветку.
Посмотрите вокруг и убедитесь, что все выглядит хорошо, прежде чем бежать
git push
Единственное, что вы должны помнить сейчас, это то, что git log по умолчанию не отслеживает перемещенные файлы, однако, запустив,
git log --follow filename
вы можете увидеть полную историю ваших файлов.источник
git merge merge-prep
и получил ошибкуfatal: refusing to merge unrelated histories
. Обходной путь заключается в следующем:git merge --allow-unrelated-histories merge-prep
.child
каталог, чтобы вам не пришлось их перемещать позже? У меня одинаковые имена файлов в подмодуле и главном репо ... поэтому я просто получаю конфликт слияния, так как он пытается объединить два файла вместе.С нами случилось, что мы создали 2 репозитория для 2 проектов, которые были настолько связаны, что не было никакого смысла их разделять, поэтому мы объединили их.
Сначала я покажу, как объединить основные ветви в каждой, а затем объясню, как вы можете расширить это на каждую полученную ветку, надеюсь, это поможет вам.
Если у вас есть работающий субмодуль, и вы хотите преобразовать его в каталог на месте, вы можете сделать:
Здесь мы делаем чистый клон на работу. Для этого процесса вам не нужно инициализировать или обновлять подмодули, поэтому просто пропустите его.
Отредактируйте
.gitmodules
с помощью вашего любимого редактора (или Vim), чтобы удалить подмодуль, который вы планируете заменить. Строки, которые нужно удалить, должны выглядеть примерно так:После сохранения файла
Здесь мы полностью удаляем отношение подмодулей, чтобы создать новое репо в проекте на месте.
Здесь мы получаем хранилище субмодулей для слияния.
Здесь мы начинаем операцию слияния двух репозиториев, но останавливаемся перед фиксацией.
Здесь мы отправляем содержимое мастера в подмодуле в каталог, где он был до префикса имени каталога
Здесь мы завершаем процедуру, делая фиксацию изменений в слиянии.
После этого вы можете нажать и начать заново с любой другой ветки для слияния, просто извлеките ветку в вашем репозитории, которая получит изменения, и измените ветку, которую вы вносите в операции слияния и дерева чтения.
источник
directory_of_submodule
git log original_path_of_file_in_submodule
например, путь, зарегистрированный в git-репозитории для файла (которого больше нет в файловой системе), даже если файл субмодуля сейчас живет вsubmodule_path/new_path_of_file
Лучший ответ на этот вопрос я нашел здесь:
http://x3ro.de/2013/09/01/Integrating-a-submodule-into-the-parent-repository.html
Эта статья объясняет процедуру очень хорошо.
источник
Вот немного улучшенная версия (IMHO) ответа @ gyim. Он вносит ряд опасных изменений в основную рабочую копию, и я думаю, что гораздо проще работать с отдельными клонами, а затем объединять их вместе в конце.
В отдельном каталоге (чтобы было легче исправить ошибки и повторить попытку) проверьте верхний репозиторий и вложенный репозиторий.
Сначала отредактируйте вложенный репозиторий, чтобы переместить все файлы в нужный подкаталог.
Запишите ГОЛОВУ
Теперь удалите подпункт из основного репо
И, наконец, просто объединить их
И сделано! Безопасно и без всякой магии.
источник
subrepo
вещи?git merge $SUBREPO_HEAD fatal: refusing to merge unrelated histories
я должен использоватьgit merge $SUBREPO_HEAD --allow-unrelated-histories
в этом случае? Или должно работать без и я ошибся?Когда
возвращается
Контекст: я сделал это
rm -r .git*
в своих папках субмодулей, прежде чем понял, что их нужно отключить в основном проекте, в который я только что добавил их. Я получил вышеупомянутую ошибку при отмене субмодулирования некоторых, но не всех из них. Во всяком случае, я исправил их, запустив, (после, конечно,rm -r .git*
)Обратите внимание, что это не сохраняет историю.
источник
Основываясь на ответе VonC , я создал простой скрипт bash, который делает это. В
add
конце должен использоваться подстановочный знак, иначе он отменит предыдущийrm
для самого подмодуля. Важно добавить содержимое каталога подмодуля, а не указывать имя самого каталога вadd
команде.В файле под названием
git-integrate-submodule
:источник
Я считаю более удобным (также?) Извлекать данные локальной фиксации из подмодуля, потому что в противном случае я бы их потерял. (Не могу их подтолкнуть, так как у меня нет доступа к этому пульту). Поэтому я добавил субмодуль / .git как remote_origin2, извлек его фиксацию и объединил из этой ветви. Не уверен, что мне все еще нужен удаленный субмодуль в качестве источника, так как я еще недостаточно знаком с git.
источник
Вот что я нашел лучше и проще всего.
В субмодульном репо из HEAD вы хотите объединиться с основным репо:
git checkout -b "mergeMe"
mkdir "foo/bar/myLib/"
(идентичный путь, по которому вы хотите файлы в основном репо)git mv * "foo/bar/myLib/"
(переместить все в путь)git commit -m "ready to merge into main"
Вернитесь в главное хранилище после удаления подмодуля и очистки пути "foo / bar / myLib":
git merge --allow-unrelated-histories SubmoduleOriginRemote/mergeMe
бум сделан
истории сохранены
не беспокойся
Обратите внимание, что это почти идентично другим ответам. Но это предполагает, что у вас есть собственный субмодуль репо. Также это позволяет легко получать будущие изменения для субмодуля.
источник