связанные - удалить сабмодуль git




Как удалить подмодуль? (14)

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

Подмодуль, клонированный с использованием 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

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

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


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


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

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

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

2.) .gitmodules изменения .gitmodules

git add .gitmodules

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

git submodule deinit -f "submodule_name"

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

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

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

git rm --cached path/to/submodule

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


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


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

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

FWIW , я также удалил папку .git прежде чем делать git add .


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

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

git-delete-submodule submodule

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


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

  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


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

#!/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)

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

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

Как правильно заметил ответ @Mark Cheverton, если вторая строка не используется, даже если вы удалили подмодуль на данный момент, то остальная папка .git / modules / the_submodule предотвратит добавление или замену того же субмодуля в будущем , Кроме того, как отметил @VonC, git rm выполнит большую часть работы над подмодулем.

--Update (07/05/2017) -

Чтобы уточнить, the_submodule - относительный путь подмодуля внутри проекта. Например, это subdir/my_submodule если подмодуль находится внутри поддиректора подкаталога.

Как указано в комментариях и других ответах , две команды (хотя и функционально достаточные для удаления подмодуля) оставляют след в секции [submodule "the_submodule"] .git/config (по состоянию на июль 2017 года), что можно удалить с помощью третьей команды:

git config -f .git/config --remove-section submodule.the_submodule 2> /dev/null

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

git submodule add [email protected]:repos/blah.git lib/blah

Бежать:

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

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

cd submodule
rm -fr .git

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


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

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


Простые шаги

  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? ,







git-submodules