Проблема с добавлением общего кода в виде подмодуля git: «уже существует в индексе»


226

Я новичок в Git и был бы признателен за помощь в добавлении подмодулей. Я получил два проекта с общим кодом. Общий код был просто скопирован в два проекта. Я создал отдельное git-репо для общего кода и удалил его из проектов, планируя добавить его как подмодуль git.

Я использовал параметр пути в git submodule add, чтобы указать папку:

git submodule add url_to_repo projectfolder

но потом получил ошибку:

'projectfolder' already exists in the index"

Это желаемая структура моего хранилища:

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

Подмодуль git можно добавить прямо в репозиторий или в новую папку там, но не в папке проекта. Проблема в том, что он действительно должен быть в папке проекта. Что я могу с этим поделать, и что я неправильно понял в опции пути добавления git submodule?


Что вы получаете, если вы делаете git ls-files --stage projectfolder?
Марк Лонгэйр

Я получаю список со всем контентом, начиная с 100644.
Ваня


8
для меня сделать git rmв существующей папке помогло: |
rogerdpack

Ответы:


343

Боюсь, в вашем вопросе недостаточно информации, чтобы быть уверенным в том, что происходит, поскольку вы не ответили на мой дополнительный вопрос, но в любом случае это может помочь.

Эта ошибка означает, что projectfolderона уже подготовлена ​​(«уже существует в индексе»). Чтобы узнать, что здесь происходит, попробуйте перечислить все в индексе в этой папке с помощью:

git ls-files --stage projectfolder

Первый столбец этого вывода скажет вам, какой тип объекта находится в индексе projectfolder. (Они похожи на файловые режимы Unix, но имеют особое значение в git.)

Я подозреваю, что вы увидите что-то вроде:

160000 d00cf29f23627fc54eb992dde6a79112677cd86c 0   projectfolder

(т. е. строка, начинающаяся с 160000), и в этом случае хранилище в projectfolderуже добавлено как «gitlink». Если он не появляется в выходных данных 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

13
Спасибо Марку за подробный ответ. Я сделал «git rm -r --cached projectfolder» и попытался снова связать подмодуль. Однако на этот раз я получаю сообщение об ошибке "Projectfolder" уже существует и не является допустимым git-репо ".
Ваня

3
@ Ваня: Это указывает на то, projectfolderчто не содержал .gitкаталог. Из вашего вопроса это звучало так, как будто вы создали новый репозиторий для projectfolderдругих и скопировали его на место, но, очевидно, это было не так. Вам нужно убрать существующий projectfolderс пути, а затем скопировать новый репозиторий (вместе с его .gitкаталогом) на место перед добавлением в качестве подмодуля. Или, если вы уже отправили его в репозиторий, представленный как url_to_repo, вы можете просто уйти projectfolderс дороги и затем добавить субмодуль из этого URL.
Марк Лонгэйр

потрясающий ответ +1 полностью
abbood

Это мне очень помогло. Спасибо!
Эван Моран

1
Это то, что я сделал, это трехэтапный процесс ШАГ 1: git rm -r --cached src / test / resources /, ШАГ 2: удалил существующий каталог ресурсов в другое место, ШАГ 3: подмодуль git add add url_to_repo src / тест / ресурсы
vikramvi

52

Удаление субмодуля вручную включает в себя несколько шагов, и это сработало для меня.

Предполагая, что вы находитесь в корневом каталоге проекта, и пример git-модуля называется «c3-pro-ios-framework»

Удалить файлы, связанные с субмодулем

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

Удалите все ссылки на субмодуль в конфигурации

vim .git/config

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

Удалить .gitmodules

rm -rf .gitmodules

Удалите его из кеша без "мерзавца"

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

Добавить субмодуль

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

2
Отличный пост, отлично работает. Здорово, что вы поделились этим, сэр. Действительно здорово.
gabn88

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

1
Я бы проголосовал за это 50 раз, если бы мог; ты только что спас мой день!
Сэнсэй Джеймс

touch .gitmodules(Должен быть в рабочем дереве, поэтому удаление помогает. Но вам нужно добавить его снова). Потрясающий пост, кстати. Единственное, что сработало здесь.
Торксед

Это был .gitкаталог, в котором остались остатки для меня. Это сработало отлично. Спасибо.
Кевин Андерсон

45

Вам нужно сначала удалить подмодуль 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команды.

Также ожидается, что аргумент будет относиться к корню parent-repo, а не к вашему рабочему каталогу, так что следите за этим.

Решение для примера выше:

  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, если это имеет какой-либо эффект.
не определено

Это решило мою проблему (создание каталога с добавлением подмодуля commnand), спасибо!
ДжекДжо

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

Поскольку главный репозиторий никогда не видел ничего (он же index'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
это удалит всю историю проекта!
редбандит
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.