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

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

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

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-адрес подмодуля в .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 Подмодуль Учебник:

чтобы удалить подмодуль, вам нужно:

  1. удалить соответствующий раздел из .
  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. удалить теперь 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

простые шаги

  1. удалить записи config:
    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 в конце, если вы поместите это в сценарий.

Смотрите также ответ я могу 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


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

  1. Set 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. Unstage и удалить $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


если подмодуль случайно добавлено, потому что вы добавили, зафиксировали и нажали папку, которая уже была репозиторием 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 затем удалите папку. Это предполагает, что добавление подмодуля-единственное, что вы сделали в недавнем РЕПО.