Вы добавили vendor/plugins/open_flash_chart_2
как запись «gitlink», но никогда не определяли ее как подмодуль.Фактически вы используете внутреннюю функцию, которую использует подмодуль git (записи gitlink), но вы не используете саму функцию подмодуля.
Возможно, вы сделали что-то вроде этого:
git clone git://github.com/korin/open_flash_chart_2_plugin.git vendor/plugins/open_flash_chart_2
git add vendor/plugins/open_flash_chart_2
Эта последняя команда является проблемой.Каталог vendor/plugins/open_flash_chart_2
начинается как независимый Git-репозиторий.Обычно такие вложенные репозитории игнорируются, но если вы скажете git add , чтобы явно добавить его, то он создаст запись gitlink, которая указывает на коммит HEAD под-репозитория вместо добавления содержимого каталога.Было бы неплохо, если бы git add отказался бы создавать такие «полумодули».
Нормальные каталоги представлены в Git как древовидные объекты;Объекты дерева дают имена и разрешения для объектов, которые они содержат (обычно это другие объекты дерева и BLOB-объектов - каталоги и файлы соответственно).Подмодули представлены в виде записей «gitlink»;Записи gitlink содержат только имя объекта (хеш) фиксации HEAD подмодуля.«Исходный репозиторий» для коммита gitlink указывается в файле .gitmodules
(и в файле .git/config
после инициализации подмодуля).
У вас есть запись, которая указывает на конкретный коммитбез записи исходного репозитория для этого коммита.Это можно исправить, превратив вашу ссылку в правильный подмодуль, или удалив ссылку и заменив ее «обычным» содержимым (обычные файлы и каталоги).
Превратите его в правильный подмодуль
Единственный бит, который вам не хватает для правильного определения vendor/plugins/open_flash_chart_2
в качестве подмодуля, - это файл .gitmodules
.Обычно (если вы еще не добавили его как пустую запись gitlink), вы просто используете git submodule add
:
git submodule add git://github.com/korin/open_flash_chart_2_plugin.git vendor/plugins/open_flash_chart_2
Как вы обнаружили, это не будет работать, если путь уже существует в индексе.Решение состоит в том, чтобы временно удалить запись gitlink из индекса, а затем добавить подмодуль:
git rm --cached vendor/plugins/open_flash_chart_2
git submodule add git://github.com/korin/open_flash_chart_2_plugin.git vendor/plugins/open_flash_chart_2
Это позволит использовать существующий суб-репозиторий (т. Е. Он не будет повторно клонировать исходный репозиторий) и выполнить этап aФайл .gitmodules
, который выглядит следующим образом:
[submodule "vendor/plugins/open_flash_chart_2"]
path = vendor/plugins/open_flash_chart_2
url = git://github.com/korin/open_flash_chart_2_plugin.git vendor/plugins/open_flash_chart_2
Он также сделает аналогичную запись в .git/config
вашего основного репозитория (без настройки path
).
Подтвердите это иу вас будет правильный подмодуль.Когда вы клонируете репозиторий (или отправляете на GitHub и клонируете оттуда), вы сможете повторно инициализировать субмодуль с помощью git submodule update --init
.
Заменить его на обычный контент
Следующийstep предполагает, что в вашем суб-репозитории в vendor/plugins/open_flash_chart_2
нет локальной истории, которую вы хотите сохранить (т.е. все, что вас волнует, это текущее рабочее дерево суб-репозитория, а не история).
Если у вас есть локальная история в под-репозитории, о которой вы заботитесь, то вы должны сделать резервную копию каталога .git
под-репозитория, прежде чем удалять его во второй команде ниже. (Также рассмотрите gitподдерево нижеприведенный пример, в котором сохраняется история HEAD под-репозитория.
git rm --cached vendor/plugins/open_flash_chart_2
rm -rf vendor/plugins/open_flash_chart_2/.git # BACK THIS UP FIRST unless you are sure you have no local changes in it
git add vendor/plugins/open_flash_chart_2
На этот раз при добавлении каталога он не является под-репозиторием, поэтому файлы будут добавляться нормально.К сожалению, поскольку мы удалили каталог .git
, не существует супер-простого способа поддерживать актуальность с исходным репозиторием.
Вы можете вместо этого использовать объединение поддеревьев .,Это позволит вам легко извлекать изменения из исходного хранилища, сохраняя файлы «плоскими» в вашем хранилище (без подмодулей).Стороннее git поддерево команда - это приятная оболочка для функций слияния поддеревьев.
git rm --cached vendor/plugins/open_flash_chart_2
git commit -m'converting to subtree; please stand by'
mv vendor/plugins/open_flash_chart_2 ../ofc2.local
git subtree add --prefix=vendor/plugins/open_flash_chart_2 ../ofc2.local HEAD
#rm -rf ../ofc2.local # if HEAD was the only tip with local history
Позже:
git remote add ofc2 git://github.com/korin/open_flash_chart_2_plugin.git
git subtree pull --prefix=vendor/plugins/open_flash_chart_2 ofc2 master
git subtree push --prefix=vendor/plugins/open_flash_chart_2 git@github.com:me/my_ofc2_fork.git changes_for_pull_request
git subtree также имеет опцию --squash
, которая позволяет вам не включать историю исходного репозитория в вашу историю, но все же позволяет вам вносить изменения в восходящий поток.