Как удалить субмодуль Git?
Кстати, есть ли причина, которую я не могу просто сделать
git submodule rm whatever
?
git
git-submodules
Р. Мартиньо Фернандес
источник
источник
git rm modulename
иrm -rf .git/modules/modulename
.git/config
. Принятый ответ показывает современный способ полного удаления субмодуля. Это также объясняется более кратко в этом ответе: stackoverflow.com/a/36593218/1562138Ответы:
Начиная с версии 1.8.3 (22 апреля 2013 г.) :
Процесс удаления также использует
git rm
(начиная с git1.8.5 Октябрь 2013).Резюме
Трехэтапный процесс удаления будет:
объяснение
rm -rf
: Об этом говорится в Дэниела Шредера «S ответ , и суммированы Eonil в комментариях :git rm
: Смотрите коммит 95c16418 :git submodule deinit
: Это происходит из этого патча :Это заботится, если (де) шаги инициализации (
.git/config
и.git/modules/xxx
)С git1.8.5 года
git rm
занимает также забота о:add
' шаг, который записывает URL субмодуля в.gitmodules
файл: его нужно удалить за вас.git rm --cached path_to_submodule
(без завершающей косой черты),который удалит этот каталог, хранящийся в индексе, в специальном режиме «160000», пометив его как корневой каталог подмодуля. ,
Если вы забудете этот последний шаг и попытаетесь добавить субмодуль в обычный каталог, вы получите сообщение об ошибке, например:
Примечание: начиная с Git 2.17 (Q2 2018), подмодуль git deinit больше не является сценарием оболочки.
Это вызов функции C.
См. Коммит 2e61273 , коммит 1342476 (14 января 2018 г.) Пратамеша Чавана (
pratham-pc
) .(Слиты Junio C Hamano -
gitster
- в фиксации ead8dbe , 13 февраля 2018)источник
submodule deinit
?.gitmodules
должно быть в порядке, но я бы все равно перепроверил что-нибудь с.git
каталогом (то есть с локальной конфигурацией в вашем локальном репо: это не так) измененоgit pull
).gitmodules
записи и удаление специальной записи в индексе и нажмете на этот репозиторий, другие могут его извлечь, и этот субмодуль исчезнет.git rm submodule
делает именно то, что вы хотите, как уже говорили другие люди.Через страницу Git Submodule Tutorial :
Для удаления подмодуля вам необходимо:
.gitmodules
файла..gitmodules
изменений:git add .gitmodules
.git/config
.git rm --cached path_to_submodule
(без косой черты)..git
каталог подмодуля :rm -rf .git/modules/path_to_submodule
git commit -m "Removed submodule <name>"
rm -rf path_to_submodule
Смотрите также : альтернативные шаги ниже .
источник
git submodule rm
просто удаляет регистрацию субмодуля, и будет удивлен, если команда также удалит локальный репозиторий. Любые локальные изменения будут безвозвратно утеряны. И, возможно, другой человек подумает, что будут удалены только файлы.Просто записка. Начиная с git 1.8.5.2, две команды будут делать:
Как правильно указал ответ @Mark Cheverton, если вторая строка не используется, даже если вы удалили субмодуль на данный момент, остальная папка .git / modules / the_submodule будет препятствовать добавлению или замене того же субмодуля в будущем. , Также, как упомянул @VonC,
git rm
большую часть работы будет выполнять подмодуль.- Обновление (05.07.2017) -
Просто чтобы уточнить,
the_submodule
это относительный путь подмодуля внутри проекта. Например, этоsubdir/my_submodule
если подмодуль находится внутри подкаталогаsubdir
.Как правильно указано в комментариях и других ответах , две команды (хотя функционально достаточные для удаления подмодуля) действительно оставляют след в
[submodule "the_submodule"]
разделе.git/config
(по состоянию на июль 2017 года), который можно удалить с помощью третьей команды:источник
.git/config
. См. Stackoverflow.com/a/36593218/1562138 для полного способа удаления подмодуля.git init && git submodule add <repository> && git rm <name>
оставляет за собой.git/config
запись и.git/modules/<name>
каталог и его содержимое. Возможно, вы не инициализировали субмодуль до его удаления?Большинство ответов на этот вопрос устарели, неполны или излишне сложны.
Подмодуль, клонированный с использованием git 1.7.8 или новее, оставит не более четырех следов самого себя в вашем локальном репо. Процесс удаления этих четырех следов задается тремя командами ниже:
источник
Простые шаги
git config -f .git/config --remove-section submodule.$submodulename
git config -f .gitmodules --remove-section submodule.$submodulename
git rm --cached $submodulepath
rm -rf $submodulepath
rm -rf .git/modules/$submodulename
Обратите внимание:
$submodulepath
не содержит начальных или конечных слешей.Фон
Когда вы делаете
git submodule add
, он только добавляет его.gitmodules
, но как только вы это сделалиgit submodule init
, он добавляет к.git/config
.Поэтому, если вы хотите удалить модули, но сможете быстро их восстановить, сделайте следующее:
Это хорошая идея сделать
git rebase HEAD
сначала иgit commit
в конце, если вы поместите это в скрипт.Также взгляните на ответ на вопрос « Можно ли заполнить подмодуль Git?» ,
источник
for dir in directory/*; do git rm --cached $dir; done
.git config -f .git/config -l | cut -d'=' -f1 | grep "submodule.$MODPATH" | sed 's/^submodule\.//' | sed 's/\.url$//'
- - похоже, вам действительно нужно сделать это в случае, если что-тоgit submodule | grep -v '^+' | cut -d' ' -f3
git submodule | grep '^+' | cut -d' ' -f2
submodulename
в двойные кавычки"submodulename"
.. ссылаясь на.git/config
файлВ дополнение к рекомендациям мне также нужно было
rm -Rf .git/modules/path/to/submodule
иметь возможность добавить новый подмодуль с тем же именем (в моем случае я заменял вилку оригиналом)источник
Чтобы удалить подмодуль, добавленный с помощью:
Запустить:
Вот и все.
Для старых версий git (около 1.8.5) используйте:
источник
git rm
все еще оставляет вещи в.git/modules/
. (2.5.4)git rm
его; Быстрый тест с 2.5.4 на моем Mac обновляет файл .gitmodules, как описано в документации здесь: git-scm.com/docs/git-rm#_submodules ... но если вы нашли какую-то комбинацию платформы / версия, где это не происходит, вы должны подать ошибку об этом.git rm
оставляет вещи в.git/modules/
dir и.git/config
файле (ubuntu, git 2.7.4). Другой ответ работает на 100%: stackoverflow.com/a/36593218/4973698Вы должны удалить запись в
.gitmodules
и.git/config
и удалить каталог модуля из истории:Если вы напишете в списке рассылки git, возможно, кто-то сделает скрипт для вас.
источник
Вы можете использовать псевдоним для автоматизации решений, предоставляемых другими:
Поместите это в свой git config, и тогда вы можете сделать:
git rms path/to/submodule
источник
git clone https://github.com/hilbix/empty.git; cd empty; git submodule add https://github.com/hilbix/empty.git one; git mv one two; git rms two
. ВТОРОЙ: Вы должны выполнить это с правильного пути.git
псевдонимы должны работать в любом месте рабочего дерева (или изящно проваливаться). ТРЕТЬЕ: происходитgit config -f .git/config
сбой в подмодулях, как.git
правило, это файл там.Подводя итог, вот что вы должны сделать:
Установить
path_to_submodule
переменную (без косой черты):path_to_submodule=path/to/submodule
Удалите соответствующую строку из файла .gitmodules:
git config -f .gitmodules --remove-section submodule.$path_to_submodule
Удалить соответствующий раздел из .git / config
git config -f .git/config --remove-section submodule.$path_to_submodule
Отмените этап и удалите $ path_to_submodule только из индекса (чтобы не потерять информацию)
git rm --cached $path_to_submodule
Отслеживание изменений, внесенных в .gitmodules
git add .gitmodules
Зафиксируйте суперпроект
git commit -m "Remove submodule submodule_name"
Удалите теперь неотслеживаемые файлы субмодулей
rm -rf $path_to_submodule
rm -rf .git/modules/$path_to_submodule
источник
git submodule update
. И если пути к подмодулям не были обновлены правильно (git выдает ошибку), удалите их:rm -rf .git/modules/<submodule> && rm -rf <submodule> && git submodule update
Если подмодуль был случайно добавлен из-за того, что вы добавили, зафиксировали и отправили папку, которая уже была Git-репозиторием (содержалась
.git
), у вас не будет.gitmodules
файла для редактирования или чего-либо еще.git/config
. В этом случае все, что вам нужно, это:FWIW , я также удалил
.git
папку, прежде чем делатьgit add
.источник
Я нашел
deinit
хорошие работы для меня:Из git docs :
источник
git
с , которые знают оdeinit
, а другой ответ удаляет.git/modules/submodule
каталог слишком рано, что , кажется, делает новыйgit
s потерпеть неудачу сейчас или потом. Кроме того (см. Мой комментарий там) удаление.git/modules/submodule
может быть неправильным путем, так что это опасный шаг, лучше всего делать его позже, только когда выgit
жалуетесь (или если вы на 299% уверены, что это то, что вы хотите, это правильный путь, который действительно необходим).git commit
внести поэтапные изменения в рабочий каталог:modified .gitmodules
иdeleted <submodule-path>
.После экспериментов со всеми различными ответами на этом сайте, я получил следующее решение:
Это восстанавливает то же состояние, что и до добавления подмодуля. Вы можете сразу же добавить подмодуль снова, что было невозможно с большинством ответов здесь.
Это оставляет вас с чистой проверкой без изменений для фиксации.
Это было проверено с:
источник
git rm --cached $path
тогдаrm -rf $path
вместоgit rm -r $path
?git submodule add https://github.com/hilbix/empty.git 'dangerous .. submodule'
-> когда вы пытаетесь удалить «опасный .. субмодуль» с помощью вашего скрипта, это будет,rm -rf ..
скорее всего, не то, что вы хотите ..Что я сейчас делаю в декабре 2012 года (объединяет большинство из этих ответов):
источник
Вот что я сделал:
1.) Удалите соответствующий раздел из файла .gitmodules. Вы можете использовать следующую команду:
2.) Стадия
.gitmodules
изменений3.) Удалить соответствующий раздел из
.git/config
. Вы можете использовать следующую команду:4.) Удалите ссылку (без косой черты):
5.) Очистить
.git/modules
:6.) Зафиксировать:
7.) Удалите теперь неотслеживаемые файлы субмодулей
источник
fatal: no submodule mapping found in .gitmodules for path 'submodule_name'
на шаге 3. Хотя оба шага были необходимы. (git v2.8.2)Недавно я обнаружил проект git, который включает много полезных команд, связанных с git: https://github.com/visionmedia/git-extras
Установите его и введите:
Тогда все готово. Каталог подмодулей будет удален из вашего репозитория и все еще будет существовать в вашей файловой системе. Вы можете зафиксировать изменения , как:
git commit -am "Remove the submodule"
.источник
git delete-submodule
, посколькуgit-extras
должно быть на пути к работе. Также обратите внимание, что я рекомендую не использоватьgit-extras
, так как многие его части очень глючные и опасные . IE,git-delete-submodule
возможно, удаляет неправильный путь ниже.git/modules/*
, так как предполагает, что модуль и путь идентичны (что не всегда так), и он не будет работать правильно, если вы попытаетесь удалить подмодуль в подмодуле.git-extras
может быть полезным на 99%, но, пожалуйста, не жалуйтесь, если что-то пойдет не так, используя его. ВЫ БЫЛИ ПРЕДУПРЕЖДЕНЫ!Мне пришлось сделать шаги Джона Даута на один шаг дальше и
cd
в каталог подмодуля, а затем удалить репозиторий Git:Затем я мог зафиксировать файлы как часть родительского репозитория Git без старой ссылки на подмодуль.
источник
git rm --cache
шаг.Вот 4 шага, которые я нашел необходимыми или полезными (сначала важными):
Теоретически ,
git rm
на шаге 1 следует позаботиться об этом. Будем надеяться, что однажды на вторую часть вопроса ОП можно будет дать положительный ответ (что это можно сделать одной командой).Но по состоянию на июль 2017 года, шаг 2 необходим для удаления данных,
.git/modules/
иначе вы не сможете, например, добавить субмодуль в будущем.Вы, вероятно, можете избежать этих двух шагов для git 1.8.5+, как отмечал ответ tinlyx , так как все
git submodule
команды работают.Шаг 3 удаляет раздел для
the_submodule
в файле.git/config
. Это должно быть сделано для полноты. (Запись может вызвать проблемы для более старых версий git, но я не могу ее протестировать).Для этого большинство ответов предлагают использовать
git submodule deinit
. Я нахожу это более явным и менее запутанным в использованииgit config -f .git/config --remove-section
. Согласно документации , ГИТ-подмодуль ,git deinit
:И последнее, но не менее важное: если вы этого не сделаете
git commit
, вы получите / можете получить ошибку при выполненииgit submodule summary
(начиная с git 2.7):Это независимо от того, выполняете ли вы шаги 2 или 3.
источник
источник
Я только что нашел скрытый файл .submodule (забыл точное имя), у него есть список ... таким образом вы можете удалить их по отдельности. У меня был только один, поэтому я удалил его. Просто, но это может испортить Git, так как я не знаю, прикреплено ли что-нибудь к субмодулю. Пока все нормально, кроме обычной проблемы с обновлением libetpan, но (надеюсь) это не имеет отношения.
Заметил, что никто не размещал ручное стирание, поэтому добавил
источник
.gitmodules
С git 2.17 и выше это просто:
источник
git 2.17.1
ниgit 2.20.1
. Однако использованиеgit rm
вместо того, чтобыgit add
работать для обоих. Примечания:-f
не нужно, если все чисто. Будьте уверены , чтобы не использовать варианты с ,git
если вы хотите защитить от непреднамеренных потерь данных. Также обратите внимание, что это оставляет.git/modules/{module_name}
на месте. Лучше всего держать его там, потому чтоgit
печатает правильную (!) Справку, как действовать, если что-то заблокировано из-за этого.Если вы только что добавили субмодуль и, например, вы просто добавили неправильный субмодуль или добавили его в неправильное место, просто
git stash
удалите папку. Это предполагает, что добавление субмодуля - единственное, что вы сделали в недавнем репо.источник
В интересах читателя, здесь делается попытка подвести итоги и дать пошаговое руководство о том, как это сделать, если все работает не так, как ожидалось. Ниже приведен проверенный и безопасный способ для
git
версии2.17
и выше избавиться от подмодуля :2.20.1
и Ubuntu 18.042.17.1
."$submodule"
просто чтобы подчеркнуть, где поставить имя, и что вы должны быть осторожны с пробелами и тому подобное"$submodule"
на путь Windows правильно указанного пути к подмодулю. (Я не винда)Обратите внимание, что
является прямым обратным к
но
также довольно наоборот
потому что некоторые команды в основном должны делать больше, чем просто одна вещь:
git submodule deinit -- module
.git/config
git rm
.gitmodules
git submodule add
.git/modules/NAME/
git submodule init
, поэтому обновления.git/config
git submodule update
, поэтому, нерекурсивно проверяет модуль.gitmodules
git submodule update --init --recursive -- module
Это не может быть полностью симметричным, так как сохранение его строго симметричным не имеет большого смысла. Просто не нужно больше двух команд. Также «извлечение данных» является неявным, потому что это необходимо, но удаление кэшированной информации не выполняется, потому что это вообще не нужно и может стереть ценные данные.
Это действительно озадачивает новичков, но в основном это хорошая вещь:
git
просто делает очевидную вещь и делает это правильно, и даже не пытается сделать больше.git
это инструмент, который должен выполнять надежную работу, вместо того, чтобы быть просто еще одним «Eierlegende Wollmilchsau» («Eierlegende Wollmilchsau» переводится для меня как «какая-то злая версия швейцарского армейского ножа»).Так что я понимаю жалобы людей, говорящих: «Почему не делает
git
очевидное для меня». Это потому, что «очевидное» здесь зависит от точки зрения. Надежность в любой ситуации гораздо важнее. Следовательно, то, что для вас очевидно, часто не является правильным во всех возможных технических ситуациях. Пожалуйста, помните, что AFAICSgit
следует техническим путем, а не социальным. (Отсюда и умное название: git)Если это не удается
Команды выше могут не работать из-за следующего:
git
слишком стар. Тогда используйте более новыйgit
. (См. Ниже, как.)git clean
смысле не чист . Затем сначала очистите свой подмодуль с помощью этой команды. (См. ниже.)git
. Тогда вы находитесь на темной стороне, и все становится уродливым и сложным. (Возможно, использование другой машины исправляет это.)git
опытный пользователь).Возможные исправления следуют.
Используйте более новый
git
Если Ваш аппарат слишком стар , нет
submodule deinit
в вашемgit
. Если вы не хотите (или можете) обновить свойgit
, то просто используйте другой компьютер с более новымgit
!git
предназначен для полного распространения, так что вы можете использовать другойgit
для выполнения работы:workhorse:~/path/to/worktree$ git status --porcelain
не должен ничего выводить! Если это произойдет, очистить вещи в первую очередь!workhorse:~/path/to/worktree$ ssh account@othermachine
othermachine:~$ git clone --recursive me@workhorse path/to/worktree/.git TMPWORK && cd TMPWORK
othermachine:~/TMPWORK$ git commit . -m . && exit
workhorse:~/path/to/worktree$ git fetch account@othermachine:TMPWORK/.git
workhorse:~/path/to/worktree$ git merge --ff-only FETCH_HEAD
, Если это не работает, используйтеgit reset --soft FETCH_HEAD
git status
снова не станет чистым. Вы можете сделать это, потому что вы сделали это раньше, благодаря первому шагу.Это
othermachine
может быть какая-то виртуальная машина или Ubuntu WSL под Windows, что угодно. Даже achroot
(но я предполагаю, что вы не являетесь пользователем root, потому что еслиroot
это так, вам будет проще перейти на более новую версиюgit
).Обратите внимание, что если вы не можете
ssh
войти, есть множество способов транспортировкиgit
репозиториев. Вы можете скопировать свое рабочее дерево на USB-накопитель (включая.git
каталог) и клонировать с него. Клонируйте копию, чтобы снова получить все в чистом виде. Это может быть PITA, если ваши подмодули не доступны напрямую с другой машины. Но и для этого есть решение:Вы можете использовать это умножение, и это сохраняется в
$HOME/.gitconfig
. Что-то вродепереписывает URL как
в
Это легко, если вы начнете привыкать к таким мощным
git
функциям.Очистить вещи в первую очередь
Очистка вручную - это хорошо, потому что таким образом вы можете обнаружить некоторые вещи, о которых вы забыли.
git status
иgit clean -ixfd
ваш другrm
иdeinit
как можно дольше. Варианты (как-f
) дляgit
хороши, если вы профессионал. Но, как вы пришли сюда, вы, вероятно, не так опытны в этомsubmodule
районе. Так что лучше быть в безопасности, чем потом сожалеть.Пример:
Понимаете, в этом нет
-f
необходимостиsubmodule deinit
. Если все чисто, в некоторомgit clean
смысле. Также обратите внимание, чтоgit clean -x
это не нужно. Это означает, чтоgit submodule deinit
безусловно удаляет неотслеживаемые файлы, которые игнорируются. Обычно это то, что вы хотите, но не забывайте об этом. Иногда игнорируемые файлы могут быть ценными, например, кэшированные данные, для расчета которых снова требуются часы или дни.Почему никогда не удалить
$GIT_DIR/modules/<name>/
?Вероятно, люди хотят удалить кэшированный репозиторий, потому что они боятся столкнуться с проблемой позже. Это правда, но столкновение с этой «проблемой» - верный способ ее решить! Потому что исправить легко и правильно, вы сможете жить долго и счастливо. Это позволяет избежать более громоздких проблем, чем когда вы удаляете данные самостоятельно.
Пример:
Последняя строка выводит следующую ошибку:
Почему эта ошибка? Поскольку
.git/modules/two/
ранее он был заполнен с https://github.com/hilbix/empty.git, а теперь должен быть повторно заполнен чем-то другим, а именно https://github.com/hilbix/src.git . Вы не увидите этого, если будете повторно заполнять его с https://github.com/hilbix/empty.gitЧто делать сейчас? Ну, просто делай так, как сказал! использование
--name someunusedname
.gitmodules
тогда выглядитls -1p .git/modules/
даетТаким образом, в будущем вы можете переключать ветки / коммиты вперёд и назад и больше никогда не попадете в неприятности из-за
two/
наличия двух разных (и, возможно, несовместимых) вышестоящих репозиториев. И самое лучшее: вы храните оба кэшированных локально.git
).Однако, если вы удалили кэшированный каталог, обе разные проверки наткнуться друг на друга, потому что вы не будете использовать
--name
параметры, верно? Поэтому каждый раз, когда вы делаете заказ, вам, возможно, придется.git/modules/<module>/
снова и снова удалять каталог. Это чрезвычайно громоздко и затрудняет использование чего-то подобногоgit bisect
.Таким образом, существует техническая причина сохранить этот каталог модулей в качестве заполнителя. Люди, которые рекомендуют удалить что-то ниже,
.git/modules/
либо не знают лучше, либо забывают сказать вам, что это делаетgit bisect
практически невозможным использование таких мощных функций, как, например, несовместимость субмодулей.Еще одна причина показана выше. Посмотрите на
ls
. Что ты там видишь?Ну, второй вариант модуля
two/
не под.git/modules/two/
, он под.git/modules/someunusedname/
! Так что такие вещиgit rm $module; rm -f .git/module/$module
совершенно не так! Вы должны либо проконсультироваться,module/.git
либо.gitmodules
найти нужную вещь для удаления!Так что не только большинство других ответов попадают в эту опасную ловушку, но даже очень популярные
git
расширения имели эту ошибку ( теперь она исправлена )! Так что лучше держите руки в.git/
справочнике, если не совсем точно, что вы делаете!К вашему сведению, вы, наверное, догадались: hilbix - это мой аккаунт на GitHub.
источник
Подводя итог, вот что вы должны сделать:
Установите path_to_submodule var (без косой черты):
Удалите соответствующую строку из файла .gitmodules:
Удалить соответствующий раздел из .git / config
Отмените этап и удалите $ path_to_submodule только из индекса (чтобы не потерять информацию)
Отслеживание изменений, внесенных в .gitmodules
Зафиксируйте суперпроект
Удалите теперь неотслеживаемые файлы субмодулей
Смотрите также: Альтернативные направляющие линии
источник
git rm --cached $path_to_submodule
иgit add .gitmodules
нет? Я получил ошибку в первой команде:fatal: Please stage your changes to .gitmodules or stash them to proceed
потому что у меня были неустановленные изменения в.gitmodules
. Выполнениеgit add .gitmodules
первого решает это.Это легко:
.gitmodules
git add .gitmodules
git submodule deinit <path to submodule>
git rm <path to submodule>
Вам придется удалить файлы модуля в вашем проекте вручную.
источник
git submodule deinit <submodule_name>
иgit rm <path_to_submodule>
. Последняя команда автоматически удаляет запись внутри.gitmodules
. Git 2.17Я создал скрипт bash, чтобы облегчить процесс удаления. Он также проверяет, есть ли изменения в репо, оставленные несохраненными, и запрашивает подтверждение. Было протестировано,
os x
было бы интересно узнать, работает ли он так же, как и на обычных дистрибутивах Linux:https://gist.github.com/fabifrank/cdc7e67fd194333760b060835ac0172f
источник
В последнем git требуется всего 4 операции для удаления подмодуля git.
.gitmodules
git add .gitmodules
git rm --cached <path_to_submodule>
git commit -m "Removed submodule xxx"
источник
В случае, если вам нужно сделать это в одной строке с помощью скрипта bash, как показано ниже:
$ cd /path/to/your/repo && /bin/bash $HOME/remove_submodule.sh /path/to/the/submodule
Создайте файл сценария bash в каталоге с
$HOME
именем ieremove_submodule.sh
:источник
git rm <submodule path> && git commit
. Это можно отменить с помощьюgit revert
..gitmodules
файле.$GIT_DIR/modules/<name>/
.Источник:
git help submodules
источник
Удаление подмодуля git
Для удаления
git
подмодуля ниже 4 шага..gitmodules
файле. Вход может быть, как указано нижеgit add .gitmodules
git rm --cached <path_to_submodule>
.git commit -m "Removed submodule xxx"
и нажмите.Дополнительные 2 шага, упомянутые ниже, необходимы для полной очистки субмодуля в локальной клонированной копии.
.git/config
файле. Вход может быть, как указано нижеrm -rf .git/modules/path_to_submodule
Эти 5-й и 6-й этапы не создают никаких изменений, которые необходимо зафиксировать.
источник
git submodule deinit
git-scm.com/docs/git-submodule#Documentation/…