Питання Як видалити підмодуль?


Як видалити підмодуль Git?

До речі, чи є причина, я просто не можу зробити

git submodule rm whatever

?


3024
2017-08-11 14:31


походження


Проста відповідь stackoverflow.com/a/21211232/94687 тепер є правильним і має бути позначено таким чином. Тепер це просто git rm modulename і rm -rf .git/modules/modulename - imz -- Ivan Zakharyaschev
Насправді це не так. Ця відповідь не стосується видалення підмодульного запису з .git/config. Прийнята відповідь показує найновіший спосіб повного видалення підмодуля. Це також пояснюється більш коротко в цій відповіді: stackoverflow.com/a/36593218/1562138 - fvgs
Я знайшов цю статтю дуже корисною у видаленні підмодулів. Він містить інформацію про видалення записів у файлах .gitsubmodules та .git / config посилання - Ri_
Будь ласка, заощадьте себе деякий час і безпосередньо підіште відповідь, яка працює (у 2017 році): stackoverflow.com/a/36593218/528313 - Vincenzo Pii
Я боровся з проблемами підмодуля протягом двох днів. Прорив вийшов, коли я знайшов це: forums.developer.apple.com/thread/13102. В принципі, Xcode і, можливо, інші додатки, намагаються розширити URL-адреси, що містять '~'. Одного разу я змінив ssh: //username@server.remoteHost.com/~/git/MyRepo.git до ssh: //username@server.remoteHost.com/home/username/git/MyRepo.git (шукай фактичний шлях на вашому сервері), вся дивність зник з десяти хвилин. Дивись також stackoverflow.com/questions/32833100/... - Elise van Looij


Відповіді:


З тих пір 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: Це згадується в Даніел Шредерс відповісти, і підбито підсумками Еоніл в коментарів:

Це залишає .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 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 submodule deinit більше не є сценарієм оболонки.
Це виклик до функції C.

Побачити здійснити 2e61273, вчинити 1342476 (14 січня 2018 р.) На Пратамеш Чаван (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} "$@"

1799
2018-04-23 05:57



Чи можете ви навести приклад використання для submodule deinit? - zakdances
@ yourfriendzak Ось один з прикладів того, хто успішно використовує його: stackoverflow.com/a/16161950/6309. Але майте на увазі, що, на відміну від того, що я спочатку вважав, 1.8.3 ще не випущений! У Unix ви можете зібрати його з джерел. - VonC
@HamishDowner спеціальний запис повинен бути відсутній (каталог вже не є підмодулем), а також .gitmodules повинен бути в порядку, але я б ще перевірив що-небудь з .git каталог (тобто місцевий config, в межах вашого місцевого репо: це не змінюється а git pull) - VonC
@ Jayen так, якщо ви зобов'язуєтесь видалити .gitmodules введення та видалення спеціального запису в індексі та натискання на це репо, інші можуть його витягнути, і цей підмодуль буде зникнути. - VonC
Ось скрипт, який автоматизує ці кроки: gist.github.com/sharplet/6289697. Додайте його до свого PATH і git remove-submodule path/to/submodule. - Adam Sharp


Через сторінку Підручник Git Підмодуль:

Щоб видалити підмодуль, потрібно:

  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

Дивись також: альтернативні кроки нижче.


3145
2018-01-18 23:30



"І, до речі, чи є причина, я не можу просто набрати підмодуль rm що завгодно?" ? - abernier
@ abernier Звичайна відповідь може бути "тому, що така команда не існує". Я думаю, що вони намагаються зробити вилучення субмодульних файлів проти конфігурації підмодулів явним, щоб уникнути випадкової втрати даних. Можливо, це подумає одна людина git submodule rm просто видаляє реєстрацію субмодулів, і буде здивований, якщо команда також видалила локальний репозиторій. Будь-які локальні зміни будуть безповоротно втрачені. І, можливо, інша людина буде думати, що тільки файли будуть вилучені. - John Douthat
Чесно кажучи, я не знаю чому. Я сподіваюся, що вони додадуть команду, однак. Ці 4 кроки занадто складні. - John Douthat
Ось скрипт bash, який видаляє підмодуль, просто створіть псевдонім git для submodule-rm;) gist.github.com/2491147 - Capi Etheriel
Також потрібен rm -rf .git \ modules \ підмодуль ім'я? - rogerdpack


Просто зауваження. Оскільки git 1.8.5.2 виконає дві команди:

git rm the_submodule
rm -rf .git/modules/the_submodule

Оскільки відповідь @Mark Cheverton правильно вказала, якщо друга рядок не використовується, навіть якщо ви вже видалили підмодуль, остання папка .git / modules / the_submodule не дозволить тому самому підмодулю відновити або замінити в майбутньому . Крім того, як згадував @VonC, git rm буде виконувати більшу частину роботи на підмодулі.

- Оновлено (05/07/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

332
2018-04-13 08:51



Я на git версії 2.4.9 (Apple Git-60), і все, що мені довелося зробити, це rm the_submodule. Я натиснув, що потім знову додав папку з назвою тієї ж, що і підмодуль, і вона працювала без проблем. - David Silva Smith
Це не видаляє запис підмодуля з .git/config. Побачити stackoverflow.com/a/36593218/1562138 для повного способу видалення підмодуля. - fvgs
Це 100% абсолютно блискуче і працює. Ого. - Dan Rosenstark
@drevicko Я просто протестував це з Git 2.11.1, і я спостерігаю ті самі дії, що і раніше. git init && git submodule add <repository> && git rm <name> залишає за собою .git/config вхід і .git/modules/<name> каталог та його вміст. Можливо, ви не ініціалізували підмодуль до його видалення? - fvgs
Я відчуваю себе безпечніше запустити це перше .. git підмодуль deinit -f the_submodule - danday74


Більшість відповідей на це питання застаріли, неповні або зайво складні.

Підмодуль, клонований за допомогою 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

246
2018-03-02 16:07



Чому ця відповідь настільки мала? Всі ці популярні відповіді пропускають щось, це єдине, що дійсно усуває всі сліди підмодуля, у найпростішому вигляді. І примітка: порядок команд має значення. - mbdevpl
Відповісти на моє власне запитання: stackoverflow.com/questions/97875/rm-rf-equivalent-for-windows - Thomas
@mbdevpl прийшло через 3 роки після прийнятої відповіді, і я думаю, що ніхто не вдалося переконати ОР прийняти цю - Andy
@Томас rm -rf просто означає "видалити всю папку", щоб ви могли це зробити з Explorer GUI у Windows. Крім того, якщо ви використовуєте git у Windows, ви також матимете git bash, тому ви можете запустити всі ці команди там, і вони будуть працювати так само, як вони - Andy Madge
ЦЕ не складна відповідь в 2018 році? - Warren P


Прості кроки

  1. Видалити записи конфігурації:
    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 в кінці, якщо ви помістіть це в скрипт.

Також подивіться відповідь на Чи можу я позбутися Git підмодуль?.


185
2017-08-11 14:43



У мене було багато підмодулів (і більше безлад), тому мені довелося пройти їх через цикл. Оскільки більшість з них де під конкретним каталогом і ls вихід містять кінцеві косу риси. Я зробив щось на зразок for dir in directory/*; do git rm --cached $dir; done. - Pablo Olmos de Aguilera C.
Щоб отримати цей список, який можна використовувати в сценарії для рекурсивного видалення - git config -f .git/config -l | cut -d'=' -f1 | grep "submodule.$MODPATH" | sed 's/^submodule\.//' | sed 's/\.url$//' - виглядає так, як ти маєш справді зробити це у випадку, якщо щось спотворено, інакше просто git submodule | grep -v '^+' | cut -d' ' -f3 - errordeveloper
щоб отримати список модулів, де не було внесено жодних локальних змін - git submodule | grep '^+' | cut -d' ' -f2 - errordeveloper
примітка, я повинен був включити submodulename у подвійних лапках "submodulename" .. посилання на .git/config файл - muon
# 2 саме те, що я шукав, спасибі! +1 - AyexeM


На додаток до рекомендацій мені також довелося rm -Rf .git/modules/path/to/submodule щоб мати змогу додати новий підмодуль з таким самим ім'ям (у моєму випадку я замінював вилку з оригіналом)


80
2017-10-12 10:17



У мене також виникли проблеми з цим. Якщо ви намагаєтесь перевстановити підмодуль на той самий шлях, він зберігає інформацію про філію в кешованому вигляді у тому місці, про який ви згадали, які непотрібні речі. - jangosteve
Спасибі, мені це було потрібно. @Anton, я згоден, і я відредагував головну відповідь, щоб додати цю інформацію. - William Denniss
Я використав параметр --name, щоб замінити роботу ... див stackoverflow.com/questions/14404704/... - joseph.hainline


Ви повинні видалити запис у .gitmodules і .git/config, і видалити каталог модуля з історії:

git rm --cached path/to/submodule

Якщо ви будете писати в списку розсилки git, хтось, напевно, зробить для вас скрипт оболонки.


46
2017-11-01 21:43



Немає потреби в будь-якому скрипті оболонки, інша відповідь має команди для видалення всіх слідів підмодуля: stackoverflow.com/a/36593218/4973698 - mbdevpl