Как удалить подмодуль?
Как удалить подмодуль Git?
кстати, почему я не могу просто сделать
git submodule rm whatever
?
21 ответов
не было фарфорового способа сказать: "Меня больше не интересует этот подмодуль", как только вы выражаете свой интерес к подмодулю с"
submodule init
".
"submodule deinit
" это способ сделать это.
процесс удаления также используется git rm
(начиная с git1.8.5 октября 2013).
резюме
процесс удаления 3 шагов после этого быть:
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
: это упоминается в Дэниэл Шредер ' s ответ, и обобщены Eonil на комментарии:
оставляет
.git/modules/<path-to-submodule>/
без изменений.
Поэтому, если вы однажды удалите подмодуль с помощью этого метода и снова добавите их, это будет невозможно, потому что репозиторий уже поврежден.
git rm
: См.совершить 95c16418:
в настоящее время используется "
git rm
" в подмодуле удаляет дерево работы подмодуля из дерева суперпроекта и ссылку gitlink из индекса.
Но секция подмодуля в.gitmodules
остается нетронутым, что является остатком теперь удаленного подмодуля и может раздражать пользователей (в отличие от настройки в.git/config
, это должно остаться как напоминание о том, что пользователь проявил интерес к этому субмодуль так будет заселен позже, когда будет проверена более старая фиксация).давайте "
git rm
" помогите пользователю не только удалить подмодуль из рабочего дерева, но и удалить" и оба.
git submodule deinit
: это связано с этот патч:
С "
git submodule init
" пользователь может сказать git, что они заботятся об одном или нескольких подмодулях и хотят, чтобы он был заполнен при следующем вызове "git submodule update
".
Но в настоящее время нет простого способа сказать git, что они больше не заботятся о подмодуле и хотят избавиться от локального дерева работы (если пользователь не знает много о внутренних подмодулях и не удаляет "submodule.$name.url
" установка из.git/config
вместе с самим деревом работы).помогите этим пользователям, предоставив'
deinit
'.
Это удаляет все С.git/config
для с учетом подмодуль(ы) (или для всех тех, которые были инициализированы, если'.
' дается).
Сбой, если текущее дерево работы содержит изменения, если не принудительно.
Жалуйтесь, когда для подмодуля, заданного в командной строке, параметр url не может быть найден в.git/config
, но тем не менее не подведите.
это позаботится, если шаги инициализации (de) (.git/config
и .git/modules/xxx
)
начиная с git1.8.5,git rm
принимает и уход:
- '
add
' шаг, который записывает url-адрес подмодуля в.gitmodules
file: это нужно удалить для вас. - подмодуль специальная запись (что подтверждается этот вопрос): 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 submodule deinit больше не является скриптом оболочки.
Это вызов функции C.
посмотреть совершить 2e61273, совершить 1342476 (14 янв 2018) by Prathamesh Чаван (pratham-pc
).
(слитый Junio C Hamano -- gitster
-- на совершить ead8dbe, 13 февраля 2018)
git ${wt_prefix:+-C "$wt_prefix"} submodule--helper deinit \
${GIT_QUIET:+--quiet} \
${prefix:+--prefix "$prefix"} \
${force:+--force} \
${deinit_all:+--all} "$@"
на странице Git Подмодуль Учебник:
чтобы удалить подмодуль, вам нужно:
- удалить соответствующий раздел из .
- этап
.gitmodules
измененияgit add .gitmodules
- удалить соответствующий раздел из
.git/config
. - выполнить
git rm --cached path_to_submodule
(без Слэша). - выполнить
rm -rf .git/modules/path_to_submodule
- фиксация
git commit -m "Removed submodule <name>"
- удалить теперь untracked файлы подмодулей
rm -rf path_to_submodule
см. также: альтернативные меры, ниже.
просто к сведению. Начиная с 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
если подмодуль находится внутри подкаталога subdir
.
как правильно указано в комментариях и другие ответы, две команды (хотя функционально достаточно, чтобы удалить подмодуль), оставляют след в на .git/config
(по состоянию на июль 2017 года), который может быть удален с помощью третьей команды:
git config -f .git/config --remove-section submodule.the_submodule 2> /dev/null
большинство ответов на этот вопрос являются устаревшими, неполными или излишне сложным.
подмодуль, клонированный с помощью 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
простые шаги
- удалить записи config:
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
в конце, если вы поместите это в сценарий.
Смотрите также ответ я могу unpopulate подмодуль ГИТ?.
В дополнение к рекомендациям, я должен был rm -Rf .git/modules/path/to/submodule
чтобы иметь возможность добавить новый подмодуль с тем же именем (в моем случае я заменял вилку на оригинал)
вы должны удалить запись в .gitmodules
и .git/config
, и удалите каталог модуля из истории:
git rm --cached path/to/submodule
Если вы напишете в списке рассылки git, вероятно, кто-то сделает сценарий оболочки для вас.
удалить субмодуль добавлено через:
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
Вы можете использовать псевдоним для автоматизации решения от других:
[alias]
rms = "!f(){ git rm --cached \"\";rm -r \"\";git config -f .gitmodules --remove-section \"submodule.\";git config -f .git/config --remove-section \"submodule.\";git add .gitmodules; }; f"
поместите это в свою конфигурацию git, а затем вы можете сделать:git rms path/to/submodule
подводя итог, вот что вы должны сделать:
-
Set
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
-
Unstage и удалить $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 (contained .git
), у вас не будет .gitmodules
файл для редактирования или что-нибудь в .git/config
. в этом случае все, что вам нужно - это :
git rm --cached subfolder
git add subfolder
git commit -m "Enter message here"
git push
чистки рядов, я также удалены
после экспериментов с разными ответами на этом сайте, я закончил с этим решением:
#!/bin/sh
path=""
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)
что я сейчас делаю Dec 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}"
нашел deinit
работает хорошо для меня:
git submodule deinit <submodule-name>
git rm <submodule-name>
С git docs:
deinit
отменить регистрацию данных подмодулей, т. е. удалить все
submodule.$name
раздел С.git / config вместе со своим деревом работы.
недавно я узнал проект git, который включает много полезных команд, связанных с git: https://github.com/visionmedia/git-extras
установите его и введите:
git-delete-submodule submodule
тогда все сделано. Каталог подмодулей будет удален из вашего РЕПО и все еще существует в вашей файловой системе. Затем вы можете совершить изменение, например:git commit -am "Remove the submodule"
.
вот что я сделал :
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.) Удалите gitlink (без косой черты):
git rm --cached path_to_submodule
5.) Очистка .git/modules
:
rm -rf .git/modules/path_to_submodule
6.) Commit:
git commit -m "Removed submodule <name>"
7.) Удалить файлы подмодулей, которые теперь не отслеживаются
rm -rf path_to_submodule
Я должен был принять меры Джон Douthat один шаг дальше и cd
в каталог подмодуля, а затем удалите репозиторий Git:
cd submodule
rm -fr .git
тогда я мог бы зафиксировать файлы как часть родительского репозитория Git без старой ссылки на подмодуль.
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
Я только что нашел .подмодуль (забыл точное имя) скрытый файл, у него есть список... вы можете стереть их по отдельности. У меня был только один, поэтому я его удалил. Просто, но это может испортить Git, так как я не знаю, связано ли что-нибудь с подмодулем. Пока все в порядке, кроме обычной проблемы обновления libetpan, но это (надеюсь) не связано.
заметил, что никто не опубликовал ручное стирание, поэтому добавил
вот 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 должен позаботиться об этом. Надеюсь, на вторую часть вопроса OP можно ответить положительно однажды (что это можно сделать одной командой).
но по состоянию на июль 2017 года,Шаг 2 необходимо удалить данные в .git/modules/
в противном случае, вы не можете, например, добавить подмодуль в будущем.
вы, вероятно, можете уйти с вышеуказанными двумя шагами для git 1.8.5+ as 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.
Если вы только что добавили подмодуль, и, например, вы просто добавили неправильный подмодуль или добавили его в неправильное место, просто сделайте git stash
затем удалите папку. Это предполагает, что добавление подмодуля-единственное, что вы сделали в недавнем РЕПО.