Я новичок в 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
git-submodules
Vanja
источник
источник
git ls-files --stage projectfolder
?git rm
в существующей папке помогло: |Ответы:
Боюсь, в вашем вопросе недостаточно информации, чтобы быть уверенным в том, что происходит, поскольку вы не ответили на мой дополнительный вопрос, но в любом случае это может помочь.
Эта ошибка означает, что
projectfolder
она уже подготовлена («уже существует в индексе»). Чтобы узнать, что здесь происходит, попробуйте перечислить все в индексе в этой папке с помощью:Первый столбец этого вывода скажет вам, какой тип объекта находится в индексе
projectfolder
. (Они похожи на файловые режимы Unix, но имеют особое значение в git.)Я подозреваю, что вы увидите что-то вроде:
(т. е. строка, начинающаяся с
160000
), и в этом случае хранилище вprojectfolder
уже добавлено как «gitlink». Если он не появляется в выходных данныхgit submodule
, и вы хотите добавить его как подмодуль, вы можете сделать:... чтобы удалить его, а затем:
... чтобы добавить хранилище как подмодуль.
Тем не менее, также возможно, что вы увидите много больших двоичных объектов в списке (с режимами файлов
100644
и100755
), что подсказывает мне, что вы не удалили файлы должным образомprojectfolder
перед копированием нового репозитория на место. Если это так, вы можете сделать следующее, чтобы удалить все эти файлы:... а затем добавьте субмодуль с помощью:
источник
projectfolder
что не содержал.git
каталог. Из вашего вопроса это звучало так, как будто вы создали новый репозиторий дляprojectfolder
других и скопировали его на место, но, очевидно, это было не так. Вам нужно убрать существующийprojectfolder
с пути, а затем скопировать новый репозиторий (вместе с его.git
каталогом) на место перед добавлением в качестве подмодуля. Или, если вы уже отправили его в репозиторий, представленный какurl_to_repo
, вы можете просто уйтиprojectfolder
с дороги и затем добавить субмодуль из этого URL.Удаление субмодуля вручную включает в себя несколько шагов, и это сработало для меня.
Предполагая, что вы находитесь в корневом каталоге проекта, и пример git-модуля называется «c3-pro-ios-framework»
Удалить файлы, связанные с субмодулем
Удалите все ссылки на субмодуль в конфигурации
Удалить .gitmodules
Удалите его из кеша без "мерзавца"
Добавить субмодуль
источник
git submodule
после удаления и перед добавлением, и это дало мне ошибку, фиксация удаления позаботилась об этом.touch .gitmodules
(Должен быть в рабочем дереве, поэтому удаление помогает. Но вам нужно добавить его снова). Потрясающий пост, кстати. Единственное, что сработало здесь..git
каталог, в котором остались остатки для меня. Это сработало отлично. Спасибо.Вам нужно сначала удалить подмодуль git-репозиторий (в данном случае это папка проекта) для пути к git.
а затем добавить субмодуль
источник
git submodule add --force <git_submodule_repository>
работал на меня, чтобы сохранить то же имя подмодуляУ меня была такая же проблема, и после долгих поисков нашел ответ.
Ошибка, которую я получал, была немного другой:
<path> already exists and is not a valid git repo
(и добавлена здесь для ценности SEO)Решение - НЕ создавать каталог, в котором будет размещаться субмодуль. Каталог будет создан как часть
git submodule add
команды.Также ожидается, что аргумент будет относиться к корню parent-repo, а не к вашему рабочему каталогу, так что следите за этим.
Решение для примера выше:
common_code
каталог не существует.cd Repo
git submodule add git://url_to_repo projectfolder/common_code/
( Обратите внимание на обязательную косую черту. )Я надеюсь, что это кому-то поможет, так как об этом очень мало информации.
источник
git submodule add
, и завершающий слеш не требуется.если существует папка с именем
x
под управлением git, вы хотите добавить субмодуль с тем же именем, вы должны удалить папкуx
и зафиксировать ее в первую очередь .Обновлено @ ujjwal-singh:
Фиксация не нужна, достаточно постановки ..
git add
/git rm -r
источник
git add
/gir rm -r
Просто чтобы уточнить на человеческом языке, что ошибка пытается сказать вам:
Вы не можете создать репозиторий в этой папке, который уже отслеживается в основном репозитории.
Например: у вас есть папка с темой,
AwesomeTheme
которая называется выделенным репозиторием, вы пытаетесь сделать дамп непосредственно в свой основной репозиторий, как это происходит,git submodule add sites/themes
и вы получаете это"AwesomeTheme" index already exists
.Вам просто нужно убедиться, что
sites/themes/AwesomeTheme
отслеживания версий в главном репозитории еще нет, поэтому подмодуль может быть создан там.Чтобы исправить, в вашем главном хранилище, если у вас есть пустой
sites/theme/AwesomeTheme
каталог, затем удалите его. Если вы уже сделали коммиты сsites/theme/AwesomeTheme
каталогом в вашем главном репозитории, вам нужно удалить всю историю этого с помощью команды, подобной этой:Теперь вы можете запустить
git submodule add git@AwesomeTheme.repowhateverurlthing sites/themes/AwesomeTheme
Поскольку главный репозиторий никогда не видел ничего (он же index'd)
sites/themes/AwesomeTheme
, он теперь может его создать.источник
Я получил это, работая наоборот. Начиная с пустого репо, добавляя субмодуль в новую папку с именем "projectfolder / common_code". После этого можно было добавить код проекта в проектную папку. Детали показаны ниже.
В пустом репо введите:
Это создаст желаемую структуру папок:
Теперь можно добавить больше подмодулей, а код проекта можно добавить в папку проекта.
Я пока не могу сказать, почему это работает так, а не иначе.
источник
Не знаю, насколько это полезно, хотя у меня возникла та же проблема при попытке зафиксировать мои файлы из IntelliJ 15. В конце я открыл SourceTree, и там я мог просто зафиксировать файл. Задача решена. Нет необходимости вводить какие-либо необычные команды git. Просто упомяну это на тот случай, если у кого-то возникнет такая же проблема.
источник
Перейдите в папку хранилища. Удалите соответствующие подмодули из .gitmodules. Выберите показать скрытые файлы. Перейдите в папку .git, удалите подмодули из папки модуля и настройте.
источник
Это происходит, если в целевом пути отсутствует файл .git. Это случилось со мной после того, как я казнил
git clean -f -d
.Мне пришлось удалить все целевые папки, показанные в сообщении, а затем выполнить
git submodule update --remote
источник
Предположим, в вашем git dir синхронизированы все изменения.
Затем сделайте:
источник