Проблема з додаванням загального коду як підмодуля git: "вже існує в індексі"


225

Я новачок в git і вдячний за допомогу з додаванням підмодулів. Я отримав два проекти, які мають спільний код. Спільний код був просто скопійований у два проекти. Я створив окремий git repo для загального коду і вилучив його з проектів, плануючи додати його як підмодуль git.

Я використовував параметр шляху git підмодулю add, щоб вказати папку:

git submodule add url_to_repo projectfolder

але потім отримала помилку:

'projectfolder' already exists in the index"

Це потрібна структура мого сховища:

repo
|-- projectfolder
    |-- folder with common code

Можна додати підмодуль git безпосередньо в репо або в нову папку там, але не в папку проектів. Проблема полягає в тому, що воно дійсно має бути в папці проектів. Що я можу зробити з цього приводу і що я неправильно зрозумів щодо варіанту шляху додавання підмодуля git?


Що ви отримуєте, якщо зробите git ls-files --stage projectfolder?
— Марк Лонгайр

Я отримую список із усім вмістом, починаючи з 100644.
— Vanja


8
для мене робота git rmз існуючої папки допомогла: |
— rogerdpack

Відповіді:


343

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

Ця помилка означає, що projectfolderвона вже є поетапною ("вже існує в індексі"). Щоб дізнатися, що тут відбувається, спробуйте перерахувати все, що знаходиться в індексі під цією папкою:

git ls-files --stage projectfolder

Перший стовпець цього виводу підкаже вам, який тип об'єкта знаходиться в індексі projectfolder. (Вони схожі на файлові режими Unix, але мають особливі значення у git.)

Я підозрюю, що ви побачите щось на кшталт:

160000 d00cf29f23627fc54eb992dde6a79112677cd86c 0   projectfolder

(тобто рядок, що починається з 160000), у цьому випадку репозиторій у projectfolderвже доданий як "посилання". Якщо він не відображається у виході git submodule, і ви хочете повторно додати його як підмодуль, ви можете зробити:

git rm --cached projectfolder

... знеструмити його, а потім:

git submodule add url_to_repo projectfolder

... додати сховище як підмодуль.

Однак також можливо, що ви побачите багато перелічених крапок (з режимами файлів 100644і 100755), які б підказали мені, що ви неправильно знімали файли, projectfolderперш ніж копіювати нове сховище на місце. Якщо це так, ви можете виконати наступне, щоб видалити всі ці файли:

git rm -r --cached projectfolder

... а потім додайте підмодуль за допомогою:

git submodule add url_to_repo projectfolder

12
Дякую Марку за детальну відповідь. Я зробив "git rm -r - кешований каталог" і спробував знову встановити підмодуль. Однак цього разу я отримую помилку rmessage "" папка проекту "вже існує і не є дійсним репотом git".
— Ваня

3
@Vanja: Це вказує на те, що каталог projectfolderне містив .git. З вашого запитання це звучало так, ніби ви створили нове сховище для projectfolderінших місць і скопіювали його на місце, але явно це не було так. Вам потрібно буде перемістити існуюче projectfolderв сторону, а потім скопіювати нове сховище (у комплекті з його .gitкаталогом) на місце, перш ніж додати його як підмодуль. Або, якщо ви вже натиснули його на сховище, представлене компанією url_to_repo, ви можете просто перейти projectfolderз потоку, а потім додати підмодуль із цієї URL-адреси.
— Марк Лонгейр

дивовижна відповідь +1 у всьому напрямку
— abbood

Це допомогло мені тонну. Дякую!
— Еван Моран

1
Це те, що я зробив, це 3 кроковий процес КРОК 1: git rm -r - кешований src / тест / ресурси /, КРОК 2: видалено існуючий каталог ресурсів в інше місце, КРОК 3: підмодуль git add add url_to_repo src / тест / ресурси
— vikramvi

52

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

Якщо припустити, що ви знаходитесь в кореневій директорії проекту, а назва вибіркового модуля git - "c3-pro-ios-Framework"

Видаліть файли, пов’язані з підмодулем

rm -rf .git/modules/c3-pro-ios-framework/

Видаліть будь-які посилання на підмодуль у config

vim .git/config

введіть тут опис зображення

Видаліть .gitmodules

rm -rf .gitmodules

Видаліть його з кеша без "git"

git rm --cached c3-pro-ios-framework

Додати підмодуль

git submodule add https://github.com/chb/c3-pro-ios-framework.git

2
Чудовий пост, чудово працює. Приємно вам поділитися цим, сер. Дійсно чудово.
— gabn88

1
Я спробував перерахувати підмодулі через git submoduleпісля видалення, і перед тим, як додати, і це дало мені помилку, переконавшись про видалення, це подбало про це.
— mehmet

1
Я б схвалив цей 50 разів, якби міг; ти щойно врятував мені день!
— Сенсей Джеймс

touch .gitmodules(потрібно знаходитись у робочому дереві, тому його видалення допомагає. Але потрібно знову додати його). Дивовижний пост btw. Єдине, що тут працювало.
— Тортується

Це був .gitкаталог, який все ще мав для мене залишки. Це спрацювало чудово. Дякую.
— Кевін Андерсон

44

Потрібно спочатку видалити ваш підмодульний сховище git (у цьому випадку папка проекту) для шляху git.

rm -rf projectfolder

git rm -r projectfolder

а потім додайте підмодуль

git submodule add <git_submodule_repository> projectfolder

4
git submodule add --force <git_submodule_repository>працював над тим, щоб зберегти ту саму назву підмодуля
— Tenfrow

1
Дякую!! Мені не потрібно було додавати в папку проектів, я просто перейшов у підкаталог і клонує звідти.
— Тоні Фрейзер

32

У мене була така ж проблема, і через години перегляду я знайшов відповідь.

Помилка, яку я отримував, була дещо іншою: <path> already exists and is not a valid git repo(і додано сюди для значення SEO)

Рішення полягає в тому, щоб НЕ створювати каталог, в якому буде розміщений підмодуль. Каталог буде створений як частина git submodule addкоманди.

Крім того, очікується, що аргумент буде відносно кореня батьків-репо, а не вашої робочої директорії, тому слідкуйте за цим.

Рішення для прикладу вище:

  1. Добре, щоб ваш батьківський репо вже був клонований.
  2. Переконайтесь, що common_codeкаталог не існує.
  3. cd Repo
  4. git submodule add git://url_to_repo projectfolder/common_code/( Зверніть увагу на необхідну кінцеву косу рису. )
  5. Здоров'я відновлено.

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


1
Крок 4 повинен розпочатися git submodule add, і косою косою рисою не потрібно.
— знесення нанівець

Виправлена ​​помилка друку. Я повторно перевірив це, і остання коса риса змінила мене. Я використовую zsh, якщо це має якийсь ефект.
— визначено

Це вирішило мою проблему (створення каталогу з допоміжним модулем add), дякую!
— jackJoe

18

якщо існує папка, названа xпід керуванням git, ви хочете додати однойменний підмодуль, вам слід видалити папку xта зробити її спочатку .

Оновлено @ ujjwal-singh:

Здійснення зобов'язань не потрібно, постановка достатня .. git add/git rm -r


Здійснення було те, що я пропустив. Коротка відповідь, але правильна!
— Qqwy

3
Здійснення зобов’язань не потрібно, інсценування достатньо .. git add/gir rm -r
— Ujjwal Singh

3

Просто щоб уточнити людською мовою, що помилка намагається сказати вам:

Ви не можете створити сховище в цій папці, яке вже відстежується в головному сховищі.

Наприклад: у вас є папка з темами, яка називається AwesomeThemeвиділеним сховищем, ви намагаєтеся скинути її безпосередньо у ваше основне сховище, як git submodule add sites/themesви отримаєте це "AwesomeTheme" index already exists.

Вам просто потрібно переконатися, що sites/themes/AwesomeThemeу відстеженні версій основного репозиторію ще немає, щоб там можна було створити підмодуль.

Отже, щоб виправити, у головному сховищі, якщо у вас порожній sites/theme/AwesomeThemeкаталог, тоді видаліть його. Якщо ви вже здійснили зв'язання з sites/theme/AwesomeThemeкаталогом у своєму головному сховищі, вам потрібно очистити всю історію з такою командою:

git filter-branch --index-filter \
              'git rm -r --cached --ignore-unmatch sites/theme/AwesomeTheme'     HEAD

Тепер ви можете бігти git submodule add git@AwesomeTheme.repowhateverurlthing sites/themes/AwesomeTheme

Оскільки головний репозиторій ніколи раніше не бачив нічого (він же індекс'd) sites/themes/AwesomeTheme, тепер він може його створити.


1

У мене це працює, роблячи це навпаки. Починаючи з порожнього репо, додаючи підмодуль у нову папку під назвою "projectfolder / common_code". Після цього можна було додати код проекту у папку проекту. Деталі показані нижче.

У порожньому репо-типі:

git submodule add url_to_repo projectfolder/common_code

Це створить потрібну структуру папки:

repo
|-- projectfolder
    |-- common_code

Тепер можна додати більше підмодулів, а код проекту можна додати до папки проекту.

Я ще не можу сказати, чому так працювало, а не інше.


0

Не знаю, чи це корисно, хоча у мене була та сама проблема, коли я намагався ввести свої файли з IntelliJ 15. Зрештою, я відкрив SourceTree і там я міг просто зробити файл. Проблема вирішена. Не потрібно видавати жодних фантазійних команд git. Просто згадуючи про це, якщо хтось має те саме питання.


0

Перейдіть до папки сховища. Видаліть відповідні підмодулі з .gitmodules. Виберіть Показати приховані файли. Перейдіть до папки .git, видаліть підмодулі з папки модуля та конфігуруйте.


0

Це відбувається, якщо у цільовому шляху відсутній файл .git. Це сталося зі мною після того, як я стратив git clean -f -d.

Мені довелося видалити всі цільові папки, які відображаються у повідомленні, а потім виконати git submodule update --remote


-18

Припустімо, у своєму git dir, скажімо, ви синхронізували всі зміни.

rm -rf .git 

rm -rf .gitmodules

Потім зробіть:

git init
git submodule add url_to_repo projectfolder

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