Подтвердить что ты не робот

Переключение подкаталога, управляемого git, в подмодуль

Раньше мы использовали локальный взлом 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 или стереть его еще более тщательно, прежде чем клонировать подмодуль на свое место?

4b9b3361

Ответ 1

Предполагая, что вы не заботитесь о текущем содержимом 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 может отличаться; например, вы можете использовать URL-адрес HTTP вместо указанного выше URL-адреса SSH.

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

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

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

  • Простой rm оставляет старые файлы в вашем индексе Git.
  • Непосредственное клонирование дает вам "субрепозитор", но не официальный подмодуль.

Предполагая, что у вас нет намеренно поставленных изменений в 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, который превратит "подрепозиторий" в настоящий подмодуль.

Ответ 2

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

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

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