Проблема з додаванням загального коду як підмодуля 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.