Яким є поточний спосіб видалення підмодуля git?


91

станом на git версії 1.9.3 (Apple Git-50) на mac, як видалити підмодуль git? Я читаю багато застарілої інформації, і багато розробників кажуть мені, що вони не працюватимуть. Який зараз шлях? буде git deinit pathToSubModule робити трюк?

Кроки, про які я думав, спрацюють, є тут, але коментарі кажуть, що вони не будуть.

Дозвольте пояснити мою поточну ситуацію та те, що мені потрібно досягти. Я встановив швидке сховище та додав його як підмодуль до свого проекту. Цей код уже зареєстровано, і інші користуються ним. Що мені зараз потрібно зробити, це розгалужити той самий швидкий репозиторій і розмістити його на більш безпечному github, який має моя компанія (отже, абсолютно інший приватний github). Після розгалуження я хочу додати цю вилку як gitSubmodule і дозволити їй замінити поточний швидкий підмодуль, який я встановив раніше.

оновлення: я читав, що наступне є правильним способом останньої версії git, будь ласка, підтвердьте?

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

Я боровся з проблемами підмодуля протягом двох днів. Прорив відбувся, коли я знайшов це: 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 (шукати фактичний шлях на вашому сервері), вся дивина зникла через десять хвилин.
Elise van Looij

Відповіді:


193

У вас є git submodule deinit

git submodule deinit <asubmodule>    
git rm <asubmodule>
# Note: asubmodule (no trailing slash)
# or, if you want to leave it in your working tree
git rm --cached <asubmodule>
rm -rf .git/modules/<asubmodule>

deinit

Скасуйте реєстрацію даних підмодулів, тобто видаліть весьsubmodule.$name
розділ .git/configразом із їхнім робочим деревом.

Наступні виклики git submodule update, git submodule foreachі git submodule syncбуде пропускати будь-які незареєстровані підмодулі , поки вони не започатковано заново, тому використовуйте цю команду , якщо ви не хочете , щоб мати локальну перевірку підмодуля в робочому дереві більше.

Якщо ви дійсно хочете видалити підмодуль із сховища та git rmзамість цього застосувати це використання .

Якщо --forceвказано, дерево роботи підмодуля буде видалено, навіть якщо воно містить локальні модифікації.


8
я хочу повністю знищити підмодуль для себе та інших користувачів. Отже, все, що мені потрібно, - це підмодуль git deinit asubmodule; та git rm asubmodule ?? Крім того, що стосується кешованих підмодулем інших користувачів, чи доведеться їм видаляти його після витягування?
j2emanue

1
Я хотів видалити локальну копію підмодуля, і це спрацювало бездоганно, всі файли в піддиректорі зникли.
malhal

1
Вам також може знадобитися, rm -rf <asubmodule>якщо ви вже перевірили версію базового сховища, яка скасувала реєстрацію підмодуля.
Сара Мессер,

6

Я використовую Git версії 2.16.2 і виконую git rmроботу переважно добре:

git rm path-to-submodule

Ви можете перевірити, git statusі git diff --cachedщо це деініціалізує підмодуль і змінюється .gitmodulesавтоматично. Як завжди, вам потрібно здійснити зміну.

Однак, незважаючи на те, що підмодуль видалено з контролю джерела, він .git/modules/path-to-submoduleвсе ще містить сховище підмодуля та .git/configмістить його URL-адресу, тому вам все одно доведеться видаляти їх вручну:

git config --remove-section submodule.path-to-submodule
rm -rf .git/modules/path-to-submodule

Зберігання сховища та конфігурації підмодуля є навмисним, щоб ви могли скасувати видалення, наприклад git reset --hard.


1
остання відповідь та найкоротше рішення
TurboGuma

3

Як безпечно видалити підмодуль.

(додається до https://stackoverflow.com/a/1260982/342794 )

  1. Перелічіть і знайдіть розділ підмодуля у .gitmodulesфайлі. Скажіть через термінал vi .gitmodules. Приклад:

    [submodule "submodules/afnetworking"]
        path = submodules/afnetworking
        url = https://github.com/CompanyName/afnetworking.git
    
  2. Підмодулі можна використовувати з локальними вилками. Для довготривалих проектів код може відрізнятися від оригінального репозиторію та мати деякі виправлення. Це гарна ідея перевірити, чи не змінювався код підмодуля протягом проекту. Приклад: Подивіться на журнали, якщо вони вказують на masterгілку або якусь локальну гілку. вивчення журналів git для пошуку модифікацій, зроблених через термінал. зазвичай вони зберігаються в каталозі, мій приклад, в submodulesкаталозі.

    User$ cd submodules/afnetworking
    User$ git log
    
  3. Видаліть розділ субмодуля з .gitmodules, збережіть файл. Приклад: git statusмає відображати лише наступні як змінені

    modified:   .gitmodules
    
  4. Інсценуйте зміни за допомогою git add .gitmodules.

  5. Перелічіть і знайдіть розділ підмодуля у .git/configфайлах. Скажіть через термінал vi .git/config. Приклад:

    [submodule "submodules/afnetworking"]
        url = https://github.com/CompanyName/afnetworking.git
    
  6. Видаліть файли sobmodule git cache. запущений git rm --cached submodules/afnetworking(без кінцевої скісної риски) вдало б його видалити. Приклад:

    User$ git rm --cached submodules/afnetworking
    rm 'submodules/afnetworking'    <-- terminal output
    
  7. Видаліть файли підмодуля з .gitкаталогу за допомогою rm -rf .git/modules/.... Підтвердьте це git statusзгодом.

    User$ rm -rf .git/modules/submodules/afnetworking/
    User$ git status
    On branch feature/replace-afnetworking-submodule-with-pod
    Changes to be committed:
      (use "git reset HEAD <file>..." to unstage)
        modified:   .gitmodules
        deleted:    submodules/afnetworking
    Untracked files:
      (use "git add <file>..." to include in what will be committed)
        submodules/afnetworking/
    
  8. Зафіксуйте зміни. Підтвердьте git statusзгодом.

    User$ git commit -m "Remove submodule afnetworking"
    [feature/replace-afnetworking-submodule-with-pod 70e239222] Remove submodule afnetworking
    2 files changed, 4 deletions(-)
      delete mode 160000 submodules/afnetworking
    User$ git status
    On branch feature/replace-afnetworking-submodule-with-pod
    Untracked files:
      (use "git add <file>..." to include in what will be committed)
        submodules/afnetworking/
    nothing added to commit but untracked files present (use "git add" to track)
    
  9. Видаліть невідстежені файли підмодуля.

    User$ rm -rf submodules/afnetworking
    
  10. Видаліть посилання з проекту Xcode. Створення, виправлення проблем компіляції та виконання.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.