Как удалить субмодуль? - PullRequest
3250 голосов
/ 11 августа 2009

Как мне удалить подмодуль Git?

Кстати, есть ли причина, по которой я не могу просто git submodule rm whatever?

Ответы [ 24 ]

38 голосов
/ 16 мая 2012

Если подмодуль был случайно добавлен, потому что вы добавили, зафиксировали и отправили папку, которая уже была Git-репозиторием (содержала .git), у вас не будет файла .gitmodules для редактирования, или что-нибудь в .git/config. В этом случае все, что вам нужно , это:

git rm --cached subfolder
git add subfolder
git commit -m "Enter message here"
git push

FWIW , я также удалил папку .git перед выполнением git add.

24 голосов
/ 09 февраля 2017

Я нашел deinit хорошо работает для меня:

git submodule deinit <submodule-name>    
git rm <submodule-name>

Из git docs :

Deinit

Отменить регистрацию данных подмодулей, т.е. удалить весь submodule.$name раздел из .git / config вместе с их рабочим деревом.

21 голосов
/ 22 октября 2014

Поэкспериментировав со всеми различными ответами на этом сайте, я получил следующее решение:

#!/bin/sh
path="$1"
if [ ! -f "$path/.git" ]; then
  echo "$path is no valid git submodule"
  exit 1
fi
git submodule deinit -f $path &&
git rm --cached $path &&
rm -rf .git/modules/$path &&
rm -rf $path &&
git reset HEAD .gitmodules &&
git config -f .gitmodules --remove-section submodule.$path

Восстанавливает то же состояние, что и до добавления подмодуля. Вы можете сразу же добавить подмодуль снова, что было невозможно с большинством ответов здесь.

git submodule add $giturl test
aboveScript test

Это дает вам чистую проверку без изменений для фиксации.

Это было проверено с:

$ git --version
git version 1.9.3 (Apple Git-50)
17 голосов
/ 19 декабря 2012

То, что я сейчас делаю, декабрь 2012 (объединяет большинство из этих ответов):

oldPath="vendor/example"
git config -f .git/config --remove-section "submodule.${oldPath}"
git config -f .gitmodules --remove-section "submodule.${oldPath}"
git rm --cached "${oldPath}"
rm -rf "${oldPath}"              ## remove src (optional)
rm -rf ".git/modules/${oldPath}" ## cleanup gitdir (optional housekeeping)
git add .gitmodules
git commit -m "Removed ${oldPath}"
14 голосов
/ 02 марта 2016

Вот что я сделал:

1.) Удалите соответствующий раздел из файла .gitmodules. Вы можете использовать следующую команду:

git config -f .gitmodules --remove-section "submodule.submodule_name"

2.) Стадия .gitmodules изменения

git add .gitmodules

3.) Удалить соответствующий раздел из .git/config. Вы можете использовать следующую команду:

git submodule deinit -f "submodule_name"

4.) Удалите ссылку (без косой черты):

git rm --cached path_to_submodule

5.) Очистить .git/modules:

rm -rf .git/modules/path_to_submodule

6.) Фиксация:

git commit -m "Removed submodule <name>"

7.) Удалите неотслеживаемые файлы субмодулей

rm -rf path_to_submodule
13 голосов
/ 08 октября 2013

Недавно я обнаружил проект git, который включает много полезных команд, связанных с git: https://github.com/visionmedia/git-extras

Установите его и введите:

git-delete-submodule submodule

Тогда все готово. Каталог подмодулей будет удален из вашего репозитория и все еще будет существовать в вашей файловой системе. Затем вы можете зафиксировать изменение как: git commit -am "Remove the submodule".

10 голосов
/ 23 ноября 2012

Мне пришлось сделать шаги Джона Даута на один шаг вперед и cd в каталог подмодуля, а затем удалить репозиторий Git:

cd submodule
rm -fr .git

Тогда я мог бы зафиксировать файлы как часть родительского репозитория Git без старой ссылки на подмодуль.

8 голосов
/ 01 июля 2017

Вот 4 шага, которые я нашел необходимыми или полезными (сначала важными):

git rm -f the_submodule
rm -rf .git/modules/the_submodule
git config -f .git/config --remove-section submodule.the_submodule
git commit -m "..."

Теоретически , 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-submodule , git deinit:

Отмените регистрацию указанных подмодулей ... Если вы действительно хотите удалить субмодуль из репозитория и коммит, использующий git-rm [1] вместо .

И последнее, но не менее важное: если вы не git commit, вы получите / можете получить ошибку при выполнении git submodule summary (по состоянию на git 2.7):

fatal: Not a git repository: 'the_submodule/.git'
* the_submodule 73f0d1d...0000000:

Это независимо от того, выполняете ли вы шаги 2 или 3.

7 голосов
/ 18 апреля 2015
project dir:     ~/foo_project/
submodule:       ~/foo_project/lib/asubmodule
- - - - - - - - - - - - - - - - - - - - - - - - -
run:
  1.   cd ~/foo_project
  2.   git rm lib/asubmodule && 
          rm .git/modules/lib/asubmodule && 
            git submodule lib/asubmodule deinit --recursive --force
7 голосов
/ 16 июня 2014

Я только что нашел скрытый файл .submodule (забыл точное имя), у него есть список ... таким образом вы можете удалить их по отдельности. У меня был только один, поэтому я удалил его. Просто, но это может испортить Git, так как я не знаю, прикреплено ли что-нибудь к субмодулю. Пока все нормально, кроме обычной проблемы с обновлением libetpan, но (надеюсь) это не имеет отношения.

Заметил, что никто не публиковал стирание вручную, поэтому добавил

...