Вопрос: Как удалить подмодуль?


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

Кстати, есть ли причина, по которой я просто не могу

git submodule rm whatever

?


2983


источник


Ответы:


поскольку git1.8.3 (22 апреля 2013 г.) :

Не было никакого фарфорового способа сказать: «Я больше не интересуюсь этим подмодулем», как только вы выражаете свой интерес к подмодулю с " submodule init».
" submodule deinit«это способ сделать это.

Процесс удаления также использует git rm(начиная с git1.8.5 октября 2013 года).

Резюме

Процесс удаления из трех этапов будет следующим:

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«помочь пользователю не только удалить подмодуль из дерева работ, но и удалить« submodule.<submodule name>"из раздела .gitmodulesфайл и этап.


git submodule deinit: Это проистекает из этот патч :

С " git submodule init«пользователь может сказать git, что они заботятся о одном или нескольких подмодулях, и хочет, чтобы он был заполнен при следующем вызове" git submodule update».
Но в настоящее время нет простого способа, чтобы они могли сказать git, что они не заботятся о субмодуле и хотят избавиться от локального дерева (если пользователь не знает много о внутренних функциях подмодуля и удаляет " submodule.$name.url"от .git/configвместе с самим деревом работ).

Помогите этим пользователям, предоставив " deinit'.
Эта удаляет все submodule.<name>от .git/configлибо для данного   подмодуль (ы) (или для всех тех, которые были инициализированы, если " .' дано).
Сбой, если текущее дерево работы содержит модификации, если не принудительно.
Жалуйтесь, если для подмодуля, указанного в командной строке, настройка URL не может быть найдена в .git/config, но, тем не менее, не подведет.

Это позаботится, если шаги инициализации (de) ( .git/configа также .git/modules/xxx)

Поскольку git1.8.5, git rmпринимает также уход за:

  • ' addшаг, который записывает url подмодуля в .gitmodulesфайл: необходимо удалить для вас.
  • подмодуль специальная запись (как иллюстрируется этот вопрос ): 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 subodule deinit больше не является скриптом оболочки.
Это вызов функции C.

Видеть совершить 2e61273 , совершить 1342476 (14 января 2018 года) Пратамеш Чаван ( pratham-pc) ,
(Слияние Юнио С Хамано - gitster- в совершить ead8dbe , 13 февраля 2018 года)

git ${wt_prefix:+-C "$wt_prefix"} submodule--helper deinit \
  ${GIT_QUIET:+--quiet} \
  ${prefix:+--prefix "$prefix"} \
  ${force:+--force} \
  ${deinit_all:+--all} "$@"

1765



Через страницу Учебник Git Submodule :

Чтобы удалить подмодуль, вам необходимо:

  1. Удалите соответствующий раздел из .gitmodulesфайл.
  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. Удалите теперь необработанные файлы подмодулей
    rm -rf path_to_submodule

Смотрите также : альтернативные шаги ниже ,


3125



Просто записка. Начиная с 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,

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

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

317



The majority of answers to this question are outdated, incomplete, or unnecessarily complex.

A submodule cloned using git 1.7.8 or newer will leave at most four traces of itself in your local repo. The process for removing those four traces is given by the three commands below:

# 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

228



Simple steps

  1. Remove config entries:
    git config -f .git/config --remove-section submodule.$submodulename
    git config -f .gitmodules --remove-section submodule.$submodulename
  2. Remove directory from index:
    git rm --cached $submodulepath
  3. Commit
  4. Delete unused files:
    rm -rf $submodulepath
    rm -rf .git/modules/$submodulename

Please note: $submodulepath doesn't contain leading or trailing slashes.

Background

When you do git submodule add, it only adds it to .gitmodules, but once you did git submodule init, it added to .git/config.

So if you wish to remove the modules, but be able to restore it quickly, then do just this:

git rm --cached $submodulepath
git config -f .git/config --remove-section submodule.$submodulepath

It is a good idea to do git rebase HEAD first and git commit at the end, if you put this in a script.

Also have a look at an answer to Can I unpopulate a Git submodule?.


181



In addition to the recommendations, I also had to rm -Rf .git/modules/path/to/submodule to be able to add a new submodule with the same name (in my case I was replacing a fork with the original)


80



You must remove the entry in .gitmodules and .git/config, and remove the directory of the module from the history:

git rm --cached path/to/submodule

If you'll write on git's mailing list probably someone will do a shell script for you.


46



To remove a submodule added using:

git submodule add blah@blah.com:repos/blah.git lib/blah

Run:

git rm lib/blah

That's it.

For old versions of git (circa ~1.8.5) use:

git submodule deinit lib/blah
git rm lib/blah
git config -f .gitmodules --remove-section submodule.lib/blah

45



You can use an alias to automate the solutions provided by others:

[alias]
  rms = "!f(){ git rm --cached \"$1\";rm -r \"$1\";git config -f .gitmodules --remove-section \"submodule.$1\";git config -f .git/config --remove-section \"submodule.$1\";git add .gitmodules; }; f"

Put that in your git config, and then you can do: git rms path/to/submodule


40



To summarize, this is what you should do :

  1. Set path_to_submodule var (no trailing slash):

    path_to_submodule=path/to/submodule

  2. Delete the relevant line from the .gitmodules file:

    git config -f .gitmodules --remove-section submodule.$path_to_submodule

  3. Delete the relevant section from .git/config

    git config -f .git/config --remove-section submodule.$path_to_submodule

  4. Unstage and remove $path_to_submodule only from the index (to prevent losing information)

    git rm --cached $path_to_submodule

  5. Track changes made to .gitmodules

    git add .gitmodules

  6. Commit the superproject

    git commit -m "Remove submodule submodule_name"

  7. Delete the now untracked submodule files

    rm -rf $path_to_submodule

    rm -rf .git/modules/$path_to_submodule


38



If the submodule was accidentally added because you added, committed and pushed a folder that was already a Git repository (contained .git), you won’t have a .gitmodules file to edit, or anything in .git/config. In this case all you need is :

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

FWIW, I also removed the .git folder before doing the git add.


36