связанные - удалить сабмодуль 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"
.
Подводя итог, это то, что вы должны сделать:
Установите
path_to_submodule
var (без косой черты):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
После экспериментов со всеми различными ответами на этом сайте я закончил это решение:
#!/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, но это (надеюсь) не связано.
Заметили, что никто не опубликовал ручное стирание, поэтому добавил
Простые шаги
- Удалить записи конфигурации:
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 rm --cached $submodulepath
git config -f .git/config --remove-section submodule.$submodulepath
Это хорошая идея сделать git rebase HEAD
сначала и git commit
в конце, если вы поместите это в скрипт.
Также взгляните на ответ, могу ли я разогнать подмодуль Git? ,