21 ответов:
С git1. 8. 3 (22 апреля 2013):
не было никакого фарфорового способа сказать "я больше не заинтересован в этом подмодуле", как только вы выразите свой интерес к подмодулю с"
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-адрес подмодуля в.gitmodulesfile: это нужно удалить для вас.- подмодуль специальная запись (что подтверждается этот вопрос): git rm удаляет его из индекса:
git rm --cached path_to_submodule(без Слэша)
Это позволит удалить этот каталог, хранящийся в индексе со специальным режимом "160000", пометив его как a корневой директории подмодуля.если вы забудете этот последний шаг и попытаетесь добавить то, что было подмодулем в качестве обычного каталога, вы получите сообщение об ошибке:
git add mysubmodule/file.txt Path 'mysubmodule/file.txt' is in submodule 'mysubmodule'
Примечание: начиная с Git 2.17 (Q2 2018), git submodule deinit больше не является сценарием оболочки.
Это вызов функции C.посмотреть commit 2e61273,совершить 1342476 (14 января 2018) by Prathamesh Чаван (
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} "$@"
на странице Git Подмодуль Учебник:
для удаления подмодуля необходимо:
- удалить соответствующий раздел из .
- этап
.gitmodulesизмененияgit add .gitmodules- удалить соответствующий раздел из
.git/config.- выполнить
git rm --cached path_to_submodule(без Слэша).- выполнить
rm -rf .git/modules/path_to_submodule- Commit
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.$submodulenamegit config -f .gitmodules --remove-section submodule.$submodulename- удалить каталог из индекса:
git rm --cached $submodulepath- Commit
- удалить неиспользуемые файлы:
rm -rf $submodulepathrm -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?.
В дополнение к рекомендациям, я должен был
rm -Rf .git/modules/path/to/submoduleчтобы иметь возможность добавить новый подмодуль с тем же именем (в моем случае я заменял вилку на оригинал)
вы должны удалить запись в
.gitmodulesи.git/config, и удалить каталог модуля из истории:git rm --cached path/to/submoduleЕсли вы будете писать в списке рассылки git, вероятно, кто-то сделает сценарий оболочки для вас.
чтобы удалить подмодуль, добавленный с помощью:
git submodule add [email protected]:repos/blah.git lib/blahRun:
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 config, а затем вы можете сделать:
git rms path/to/submodule
подводя итог, это то, что вы должны сделать :
Set
path_to_submodulevar (без косой черты):
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_submoduleUnstage и удалить $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 pushFWIW, я также удалены
после экспериментов со всеми различными ответами на этом сайте, я в конечном итоге с этим решением:
#!/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 .gitmodules3.) Удалить соответствующий раздел из
.git/config. Вы можете использовать следующую команду:git submodule deinit -f "submodule_name"4.) Удалите gitlink (без косой черты):
git rm --cached path_to_submodule5.) Очистка
.git/modules:rm -rf .git/modules/path_to_submodule6.) Совершают:
git commit -m "Removed submodule <name>"7.) Удалите теперь неотслеженные файлы подмодуля
rm -rf path_to_submodule
Я должен был сделать шаги Джона Даута еще один шаг и
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-подмодульная документация,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затем удалите папку. Это предполагает, что добавление подмодуля-это единственное, что вы сделали в недавнем РЕПО.
Comments