переключение подкаталога, управляемого git, на подмодуль - PullRequest
12 голосов
/ 30 июня 2011

Раньше у нас был локальный хак delayed_job в приложении Rails, в vendor / plugins / delayed_job.Он был установлен как одноразовое событие и проверен на git в репозитории основного приложения.

Теперь мы решили разложить delayed_job на github и заменить подкаталог подмодулем git, как описано, например, здесь:

http://doblock.com/articles/using-git-submodules-to-manage-plugins-in-rails

Перед этим я просто удалил vendor / plugins / delayed_job, не регистрируя его. Теперь, несмотря на добавление подмодуля, состояние git в основном репо по-прежнему показывает новые файлы в vendor /plugins / delayed_job.

Как нам справиться с ситуацией, когда подкаталог, который был частью репо, удален и сделан для хранения подмодуля git?Должны ли мы сначала удалить его с помощью git rm или еще более тщательно его стереть, прежде чем клонировать подмодуль на его место?

Ответы [ 2 ]

16 голосов
/ 30 июня 2011

Предполагая, что вас не волнует текущее содержимое vendor/plugins/delayed_job в вашем рабочем дереве (т. Е. Содержимое, которое будет извлечено как подмодуль, уже является подходящей заменой содержимого в вашем рабочем дереве), обычная процедура для преобразования каталога в подмодуль выглядит так:

git rm -r vendor/plugins/delayed_job
git submodule add github.com:account/delayed_job.git vendor/plugins/delayed_job

Конечно, URL репозитория GitHub может отличаться; Например, вы можете использовать HTTP-URL вместо указанного выше SSH-URL.

Но, похоже, вы сделали что-то немного другое. Насколько я могу судить, вы сделали что-то вроде этого:

rm -rf vendor/plugins/delayed_job
git clone github.com:account/delayed_job.git vendor/plugins/delayed_job

У этой процедуры есть два недостатка:

  1. Обычный rm оставляет старые файлы в вашем индексе Git.
  2. Непосредственное клонирование дает вам «субрепозиторий», но не официальный подмодуль.

Предполагая, что у вас нет преднамеренно внесенных изменений в vendor/plugins/delayed_job (вероятно, нет, поскольку вы заменяете его подмодулем), вы можете исправить ситуацию с помощью следующих команд:

git rm --cached -r vendor/plugins/delayed_job
git submodule add github.com:account/delayed_job.git vendor/plugins/delayed_job

Очистка всех vendor/plugins/delayed_job записей из индекса должна решить вашу проблему «все еще показывает новые файлы». Использование git submodule add создаст файл .gitmodules, который превратит «субпозиторий» в настоящий подмодуль.

3 голосов
/ 18 февраля 2015

Я абсолютно НЕ РЕКОМЕНДУЕТСЯ ДЕЛАТЬ ЭТО . Вы будете иметь много последствий, так как git не знает, что делать, когда каталог меняет типы на подмодуль. Было бы значительно лучшей идеей удалить старую папку, а затем создать новую с другим именем.

У нас есть репо, которым пользуются многие (более 50), и решили создать субмодуль из папки. Чтобы не пришлось менять некоторые сценарии сборки и тому подобное, мы сделали вышеописанное изменение. Но это выводит git из себя, и поэтому на каждую старую ветку (предварительное изменение подмодуля) нельзя переключиться, не удалив сначала папку и не занявшись ерундой, слияния со старыми ветвями чрезвычайно трудны, и хуже всего наша автоматизированная система сборки, которая распределены по нескольким машинам, полностью разбиты и не могут быть решены вручную, как отдельные пользователи.

Итак. Просто не делай этого. Git абсолютно не не справляется с этим изящно.

...