Вы добавили 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
Это будет использовать ваш существующий вложенный репозиторий (т.е. он не будет повторно клонировать исходный репозиторий) и подготовит .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
.
Замените его простым содержимым
На следующем шаге предполагается, что в вашем подчиненном репозитории vendor/plugins/open_flash_chart_2
нет локальной истории, которую вы хотите сохранить (т. Е. Все, что вас волнует, - это текущее рабочее дерево вложенного репозитория, а не история).
Если у вас есть локальная история в под-репозитории, которая вас интересует, то вам следует сделать резервную копию .git
каталога под-репозитория, прежде чем удалять его во второй команде ниже. (Также рассмотрите приведенный ниже пример поддерева git, который сохраняет историю заголовка под-хранилища).
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 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 также есть --squash
опция, которая позволяет вам не включать историю исходного репозитория в вашу историю, но, тем не менее, позволяет вносить изменения в исходный код.