24 Вопрос: Как удалить субмодуль?

вопрос создан в Fri, Sep 7, 2018 12:00 AM

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

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

    
3244
  1. Простой ответ stackoverflow.com/a/21211232/94687 сейчас правильный и должен быть помечен так. Теперь это просто git rm modulename и rm -rf .git/modules/modulename
    2015-06-15 15: 46: 52Z
  2. На самом деле это не так. Этот ответ не относится к удалению записи субмодуля из .git/config. Принятый ответ показывает актуальный способ полного удаления субмодуля. Это также объясняется более кратко в этом ответе: stackoverflow.com/a/36593218/1562138
    2016-04-13 09: 02: 20Z
  3. Я нашел эту статью очень полезной при удалении подмодулей. Он включает информацию об удалении записей в файлах .gitsubmodules и .git /config ссылка
    2016-05-15 17: 46: 21Z
  4. Пожалуйста, сэкономьте немного времени и сразу перейдите к ответу, который работает (в 2017 году): 2017-01-16 12: 57: 34Z
  5. Я боролся с проблемами подмодулей в течение двух дней. Прорыв произошел, когда я нашел это: forums.developer.apple.com/thread/13102. По сути, Xcode и, возможно, другие приложения борются за расширение URL-адресов, содержащих '~'. Однажды я изменил ssh: //username@server.remoteHost.com/~/git/MyRepo.git на ssh: //username@server.remoteHost.com/home/username/git/MyRepo.git (посмотрите фактический путь на вашем сервере), все странности исчезли за десять минут. См. Также заголовок stackoverflow.com/questions/32833100/…
    2018-02-09 12: 48: 33Z
24 ответа                              24                         

Начиная с git1 .8.3 (22 апреля 2013 г.) :

  

Не было никакого фарфорового способа сказать «Я больше не заинтересован в этом подмодуле», как только вы выразите свою заинтересованность в подмодуле с помощью «submodule init».
   submodule deinit - это способ сделать это.

В процессе удаления также используется git rm (начиная с git1.8.5, октябрь 2013 г.).

Резюме

Трехэтапный процесс удаления будет следующим:

0. mv a/submodule a/submodule_tmp

1. git submodule deinit -f -- a/submodule    
2. rm -rf .git/modules/a/submodule
3. git rm -f a/submodule
# Note: a/submodule (no trailing slash)

# or, if you want to leave it in your working tree and have done step 0
3.   git rm --cached a/submodule
3bis mv a/submodule_tmp a/submodule

Описание

rm -rf: это упоминается в Даниэля Шредера ответ и обобщен Eonil в комментарии :

  

Это оставляет .git/modules/<path-to-submodule>/ без изменений.
  Поэтому, если вы однажды удалите подмодуль этим методом и снова добавите их, это будет невозможно, поскольку хранилище уже повреждено.

git rm: См. commit 95c16418 :

  

ТекущиеТолько использование «git rm» в подмодуле удаляет рабочее дерево подмодуля из суперпроекта и gitlink из индекса.
  Но раздел подмодуля в .gitmodules остался нетронутым, что является остатком теперь удаленного подмодуля и может раздражать пользователей (в отличие от настройки в .git/config, это должно оставаться напоминанием о том, что пользователь проявил интерес к этому подмодулю, так что это будет повторно заполняется позже, когда проверяется более старая фиксация).

     

Пусть «git rm» поможет пользователю, не только удалив подмодуль из рабочего дерева, но и удалив раздел «submodule.<submodule name>» из файла .gitmodules и выполняя оба шага.

git submodule deinit: это связано с этим патч :

  

С помощью «git submodule init» пользователь может сказать git, что он заботится об одном или нескольких подмодулях, и хочет, чтобы он был заполнен при следующем вызове «git submodule update».
  Но в настоящее время нет простого способа, чтобы они могли сказать git, что они больше не заботятся о подмодуле и хотят избавиться от локального рабочего дерева (если пользователь не знает много о внутренностях подмодуля и не удаляет настройку «submodule.$name.url» из .git/config вместе с само дерево работы).

     

Помогите этим пользователям, введя команду deinit .
  Это удаляет весь раздел submodule.<name> из .git/config либо для данного   субмодуль (ы) (или для всех тех, которые были инициализированы, если указано «.»).
  Ошибка, если текущее рабочее дерево содержит изменения, если не принудительно.
  Пожаловаться, если для подмодуля, указанного в командной строке, параметр URL не найден в .git/config, но, тем не менее, он не завершится ошибкой.

Это необходимо для выполнения (де) шагов инициализации (.git/config и .git/modules/xxx)

Начиная с git1.8.5, git rm также заботится о:

  • шаг "add", который записывает URL-адрес подмодуля в файл .gitmodules: его необходимо удалить.
  • подмодуль специальная запись (как показано этим вопросом ): git rm удаляет его из индекса:
    git rm --cached path_to_submodule (без трейлинга) слэш)
    Это удалит этот каталог, хранящийся в индексе в специальном режиме «160000», пометив его как корневой каталог субмодуля.

Если вы забудете этот последний шаг и попытаетесь добавить субмодуль в обычный каталог, вы получите сообщение об ошибке, например:

git add mysubmodule/file.txt 
Path 'mysubmodule/file.txt' is in submodule 'mysubmodule'

Примечание: начиная с Git 2.17 (Q2 2018), подмодуль git deinit больше не является сценарием оболочки.
Это вызов функции C.

См. commit 2e61273 , зафиксировать 1342476 (14 января 2018 г.) Пратамеш Чаван (pratham-pc) .
(Объединено с Junio ​​C Hamano - gitster - в commit ead8dbe , 13 февраля 2018 г.)

git ${wt_prefix:+-C "$wt_prefix"} submodule--helper deinit \
  ${GIT_QUIET:+--quiet} \
  ${prefix:+--prefix "$prefix"} \
  ${force:+--force} \
  ${deinit_all:+--all} "$@"
    
1975
2018-02-18 18: 33: 57Z
  1. Можете ли вы привести пример использования submodule deinit?
    2013-04-28 18: 42: 55Z
  2. @ yourfriendzak - один из примеров того, как кто-то успешно его использует: stackoverflow.com /а /16161950/6309 . Но имейте в виду, что, вопреки тому, чему я изначально верил, 1.8.3 еще не выпущен! В Unix вы можете скомпилировать его из исходников.
    2013-04-28 18: 45: 11Z
  3. @ HamishDowner специальная запись должна быть удалена (каталог больше не является подмодулем), а .gitmodules должно быть в порядке, но я бы все равно перепроверил что-нибудь с каталогом .git (т. Е. С конфигурацией local в вашем локальном репо: это не изменено с помощью git pull)
    2013-06-04 15: 40: 48Z
  4. @ Jayen да, если вы фиксируете удаление записи .gitmodules и удаление специальной записи в индексе, и нажимаете на этот репозиторий, другие могут получить его и что субмодуль исчезнет.
    2013-08-02 06: 04: 12Z
  5. В текущем git (v1.9 +) обычный старый git rm submodule делает именно то, что вы хотите, как уже сказали другие люди.
    2014-06-12 17: 36: 29Z

На странице Учебное пособие по подмодулям Git :

Чтобы удалить подмодуль, вам необходимо:

  1. Удалите соответствующий раздел из файла .gitmodules.
  2. Этап .gitmodules изменений git add .gitmodules
  3. Удалить соответствующий раздел из .git/config.
  4. Запустите git rm --cached path_to_submodule (без косой черты).
  5. Выполнить rm -rf .git/modules/path_to_submodule
  6. Зафиксировать git commit -m "Removed submodule <name>"
  7. Удалить теперь неотслеживаемые файлы субмодулей
    rm -rf path_to_submodule

См. также : ниже приведены альтернативные действия .

    
3293
2018-01-05 10: 56: 34Z
  1. "И, кстати, есть ли причина, по которой я не могу просто сделать git submodule rm?"
    2011-01-20 19: 04: 03Z
  2. @ abernier Краткий ответ может быть "потому что такой команды не существует". Я предполагаю, что они пытаются сделать удаление файлов субмодулей против конфигурации субмодуля явным, чтобы избежать случайной потери данных. Возможно, один человек подумает, что git submodule rm просто удаляет регистрацию субмодуля, и был бы удивлен, если команда также удалила локальный репозиторий. Любые локальные изменения будут безвозвратно утеряны. И, возможно, другой человек подумает, что будут удалены только файлы.
    2011-01-21 01: 50: 04Z
  3. Честно говоря, я не знаю почему. Я надеюсь, что они добавляют команду, хотя. Эти 4 шага слишком сложны.
    2011-01-21 01: 56: 33Z
  4. Вот скрипт bash, который удаляет подмодуль, просто создайте псевдоним git для submodule-rm;) gist.github.com/2491147
    2012-04-25 17: 27: 39Z
  5. также требуется rm -rf .git \modules \submodule name?
    2012-05-22 17: 31: 16Z

Просто записка. Начиная с git 1.8.5.2 подойдут две команды:

git rm the_submodule
rm -rf .git/modules/the_submodule

Как правильно указал ответ @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 -f .git/config --remove-section submodule.the_submodule 2> /dev/null
    
409
2017-07-06 03: 03: 50Z
  1. Я нахожусь на git версии 2.4.9 (Apple Git-60), и все, что мне нужно было сделать, это rm the_submodule. Я нажал на это, а затем снова добавил папку с именем подмодуля, и она работала без проблем.
    2015-12-03 21: 23: 31Z
  2. Это не удаляет запись подмодуля из .git/config. См. stackoverflow.com/a /36593218/1562138 для полного способа удаления подмодуля.
    2016-04-13 08: 53: 21Z
  3. Это абсолютно блестяще и работает. Ничего себе.
    2016-04-20 14: 12: 01Z
  4. @ drevicko Я только что проверил это с помощью Git 2.11.1 и наблюдаю то же поведение, что и раньше. git init && git submodule add <repository> && git rm <name> оставляет за собой запись .git/config и каталог .git/modules/<name> и его содержимое. Возможно, вы не инициализировали субмодуль до его удаления?
    2017-02-22 16: 58: 10Z
  5. я чувствую себя безопаснее, запустив этот первый .. подмодуль git deinit -f the_submodule
    2017-03-10 04: 22: 37Z

Большинство ответов на этот вопрос устарели, неполны или излишне сложны.

Подмодуль, клонированный с использованием git 1.7.8 или новее, оставит не более четырех своих следов в вашем локальном репо. Процесс удаления этих четырех следов задается тремя командами ниже:

# Remove the submodule entry from .git/config
git submodule deinit -f path/to/submodule

# Remove the submodule directory from the superproject's .git/modules directory
rm -rf .git/modules/path/to/submodule

# Remove the entry in .gitmodules and remove the submodule directory located at path/to/submodule
git rm -f path/to/submodule
    
370
2017-05-21 06: 31: 44Z
  1. Почему в этом ответе так мало голосов? Все эти популярные ответы что-то упускают, это единственный, который действительно удаляет все следы подмодуля, самым простым способом. И обратите внимание: порядок команд имеет значение.
    2016-09-07 06: 08: 51Z
  2. Чтобы ответить на мой собственный вопрос: stackoverflow.com/questions/97875/rm-rf-equivalent-for-windows
    2017-01-19 22: 19: 05Z
  3. @ mbdevpl появился через 3 года после принятого ответа, и я полагаю, что никому не удалось убедить ОП принять этот ответ
    2017-02-20 01: 58: 13Z
  4. Это несложный ответ в 2018 году?
    2018-02-02 22: 43: 25Z
  5. файл .gitmodules , по-видимому, не влияет на выполнение этих команд
    2018-09-05 06: 50: 51Z

Простые шаги

  1. Удалить записи конфигурации:
    git config -f .git/config --remove-section submodule.$submodulename
    git config -f .gitmodules --remove-section submodule.$submodulename
  2. Удалить каталог из индекса:
    git rm --cached $submodulepath
  3. Фиксировать
  4. Удалить неиспользуемые файлы:
    rm -rf $submodulepath
    rm -rf .git/modules/$submodulename

Обратите внимание: $submodulepath не содержит начальных или конечных слешей.

Фон сильный> р> git submodule add, он только добавляет его к .gitmodules, но после того, как вы сделали git submodule init, он добавится к .git/config.

Итак, если вы хотите удалить модули, но сможете быстро их восстановить, затем сделайте только это:

git rm --cached $submodulepath
git config -f .git/config --remove-section submodule.$submodulepath

Хорошая идея сделать сначала git rebase HEAD и git commit в конце, если вы поместите это в сценарий.

Также посмотрите ответ на вопрос Можно ли заполнить субмодуль Git? . р>     

192
2017-05-24 05: 06: 17Z
  1. У меня было много подмодулей (и еще больший беспорядок), поэтому мне пришлось пропустить их через цикл for. Так как большинство из них, находящихся в определенном каталоге и в ls, содержат завершающие косые черты. Я сделал что-то вроде for dir in directory/*; do git rm --cached $dir; done.
    2011-10-09 20: 50: 32Z
  2. Чтобы получить этот список, который можно использовать в сценарии для рекурсивного удаления - 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
    2011-10-12 00: 43: 58Z
  3. , чтобы получить список модулей, в которых не было никаких локальных изменений - git submodule | grep '^+' | cut -d' ' -f2
    2011-10-12 01: 01: 47Z
  4. заметка, мне пришлось включить submodulename в двойные кавычки "submodulename" .. ссылаясь на файл .git/config
    2017-07-20 15: 22: 57Z
  5. # 2 было именно то, что я искал, спасибо! +1
    2017-09-26 15: 06: 27Z

В дополнение к рекомендациям мне также пришлось набрать rm -Rf .git/modules/path/to/submodule, чтобы иметь возможность добавить новый подмодуль с тем же именем (в моем случае я заменял вилку оригиналом)

    
81
2016-04-21 11: 36: 26Z
  1. У меня тоже были проблемы с этим. Если вы попытаетесь переустановить субмодуль по тому же пути, он сохранит информацию о ветках в кэше в указанном вами месте, что приведет к путанице.
    2012-03-05 22: 27: 32Z
  2. Спасибо, мне это тоже нужно. @Антон, я согласен, и я отредактировал ответ с наибольшим количеством голосов, чтобы добавить эту информацию.
    2012-09-23 15: 17: 11Z
  3. Я использовал опцию --name, чтобы замена работала ... см. stackoverflow.com/questions/14404704/…
    2013-01-18 18: 06: 42Z

Чтобы удалить подмодуль, добавленный с помощью:

git submodule add blah@blah.com:repos/blah.git lib/blah

Run:

git rm lib/blah

Вот и все.

Для старых версий git (около ~ 1.8.5) используйте:

git submodule deinit lib/blah
git rm lib/blah
git config -f .gitmodules --remove-section submodule.lib/blah
    
52
2014-07-03 05: 44: 03Z
  1. + 1 действительно. Это единственный правильный ответ начиная с git 1.8.3. Должен быть принят как правильный.
    2014-07-02 18: 26: 20Z
  2. + 1Правильный и чистый способ удаления в более новых версиях git.
    2014-08-22 09: 04: 26Z
  3. git rm все еще оставляет материал в .git/modules/. (2.5.4)
    2016-01-02 14: 40: 06Z
  4. @ RudolfAdamkovic это у меня работает? Обратите внимание, что он удаляет запись подмодуля только в том случае, если точный путь совпадает; если вы переместили подмодуль, а затем используете git rm, это не так; Быстрый тест с 2.5.4 на моем Mac обновляет файл .gitmodules, как описано в документации здесь: git-scm.com/docs/git-rm#_submodules ... но если вы нашли какую-то комбинацию платформы /версии, где этого не происходит, вам, вероятно, следует сообщить об ошибке он.
    2016-01-02 15: 48: 19Z
  5. Этот ответ не совсем правильный. git rm оставляет материал в каталоге .git/modules/ и файле .git/config (Ubuntu, git 2.7.4). Другой ответ работает на 100%: stackoverflow.com/a/36593218/4973698
    2016-09-07 06: 03: 43Z

Вы должны удалить запись в .gitmodules и .git/config и удалить каталог модуля из истории:

git rm --cached path/to/submodule

Если вы напишете в списке рассылки git, возможно, кто-то сделает для вас скрипт оболочки.

    
48
2011-12-28 15: 01: 28Z
  1. Нет необходимости в каком-либо сценарии оболочки, в другом ответе есть команды для удаления всех следов подмодуля: stackoverflow.com/a/36593218/4973698
    2016-09-07 06: 06: 05Z

Вы можете использовать псевдоним для автоматизации решений, предоставленных другими:

[alias]
  rms = "!f(){ git rm --cached \"$1\";rm -r \"$1\";git config -f .gitmodules --remove-section \"submodule.$1\";git config -f .git/config --remove-section \"submodule.$1\";git add .gitmodules; }; f"

Поместите это в свой git config, и тогда вы можете сделать: git rms path/to/submodule

    
41
2012-11-01 21: 43: 37Z

Подводя итог, вот что вы должны сделать:

  1. Установите path_to_submodule var (без косой черты):

    path_to_submodule=path/to/submodule р>

  2. Удалить соответствующую строку из файла .gitmodules:

    git config -f .gitmodules --remove-section submodule.$path_to_submodule р>

  3. Удалить соответствующий раздел из .git /config

    git config -f .git/config --remove-section submodule.$path_to_submodule р>

  4. Извлекайте и удаляйте $path_to_submodule только из индекса (чтобы не потерять информацию)

    git rm --cached $path_to_submodule р>

  5. Отслеживайте изменения, внесенные в .gitmodules

    git add .gitmodules р>

  6. Зафиксируйте суперпроект

    git commit -m "Remove submodule submodule_name" р>

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

    rm -rf $path_to_submodule р>

    rm -rf .git/modules/$path_to_submodule р>

40
2016-04-21 11: 36: 43Z
  1. так что все остальные, кто запустит мое изменение, должны будут запустить rm -rf $path_to_submodule rm -rf .git /modules /$path_to_submodule, чтобы удалить кэш подмодуля?
    2015-04-24 15: 09: 16Z
  2. Я рекомендую обновить, git submodule update. И если пути к подмодулям не были обновлены правильно (git выдает ошибку), удалите их: rm -rf .git/modules/<submodule> && rm -rf <submodule> && git submodule update
    2015-04-29 00: 22: 40Z

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

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

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

    
38
2016-04-21 11: 36: 34Z
  1. точно мой случай
    2017-05-21 09: 28: 37Z

Я обнаружил, что deinit хорошо работает для меня:

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

Из git docs :

  

Deinit

     

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

    
24
2017-02-09 01: 53: 37Z
  1. Согласитесь, найдено то же решение. Это лучший способ сегодня в 2018 году)
    2018-01-11 09: 18: 31Z
  2. он не удалил .git /modules /... Вы должны удалить их, смотрите ответ @fvgs
    2018-10-01 13: 40: 14Z

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

#!/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)
    
21
2015-01-21 09: 43: 01Z
  1. Почему вы используете git rm --cached $path, а затем rm -rf $path вместо git rm -r $path?
    2014-11-29 15: 00: 12Z

Чем я сейчас занимаюсь в декабре 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}"
    
17
2012-12-18 22: 50: 23Z

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

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
    
14
2016-04-21 11: 37: 22Z
  1. Спасибо за это. Для меня я должен был изменить порядок первых трех шагов в 3), 1), 2). Выполнение 1) сначала дало fatal: no submodule mapping found in .gitmodules for path 'submodule_name' на шаге 3. Хотя оба шага были необходимы. (git v2.8.2)
    2016-08-25 00: 16: 40Z

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

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

git-delete-submodule submodule

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

    
13
2016-04-21 11: 36: 59Z

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

cd submodule
rm -fr .git

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

    
10
2013-03-09 11: 42: 42Z
  1. Мне пришлось сделать это тоже, чтобы обойти ошибку "fatal: Not the git repository:" при попытке выполнить шаг git rm --cache.
    2013-04-01 15: 48: 00Z

Вот 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.

    
8
2017-07-01 18: 05: 06Z
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
2015-04-18 04: 38: 27Z

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

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

    
7
2016-04-21 11: 37: 13Z
  1. Это .gitmodules
    2019-02-09 09: 51: 31Z

Если вы только что добавили субмодуль и, например, вы просто добавили неправильный субмодуль или добавили его в неправильное место, просто выполните git stash и удалите папку. Это предполагает, что добавление субмодуля - единственное, что вы сделали в недавнем репо.

    
4
2016-06-01 08: 35: 20Z

С git 2.17 и выше это просто:

git submodule deinit -f {module_name}
git add {module_name}
git commit
    
2
2019-04-12 14: 07: 19Z

Я создал скрипт bash, чтобы упростить процесс удаления. Он также проверяет, есть ли изменения в репо, оставленные несохраненными, и запрашивает подтверждение. Он был протестирован на os x, было бы интересно узнать, работает ли он так же, как и на обычных дистрибутивах Linux:

https://gist.github.com/fabifrank/cdc7e67fd19433376001ff60/a8/a8/a835a0358     

1
2019-05-22 15: 53: 38Z

В последнем git требуется всего 4 операции для удаления подмодуля git.

  • Удалить соответствующую запись в .gitmodules
  • Сценические изменения git add .gitmodules
  • Удалить каталог подмодулей git rm --cached <path_to_submodule>
  • Зафиксировать его git commit -m "Removed submodule xxx"
0
2019-03-01 14: 48: 24Z
источник размещен Вот