Подробное решение
См. Примечание в конце этого ответа (последний абзац) для быстрой альтернативы подмодулям git с использованием npm;)
В следующем ответе вы узнаете, как извлечь папку из репозитория и создать из нее репозиторий git, а затем включить его в качестве подмодуля вместо папки.
На основе статьи Герга Байера « Перемещение файлов из одного репозитория Git в другой с сохранением истории»
Вначале у нас есть что-то вроде этого:
<git repository A>
someFolders
someFiles
someLib <-- we want this to be a new repo and a git submodule!
some files
В указанные ниже шаги, я буду называть это someLib
так <directory 1>
.
В итоге у нас будет что-то вроде этого:
<git repository A>
someFolders
someFiles
@submodule --> <git repository B>
<git repository B>
someFolders
someFiles
Создайте новый репозиторий git из папки в другом репозитории
Шаг 1
Получите новую копию репозитория для разделения.
git clone <git repository A url>
cd <git repository A directory>
Шаг 2
Текущая папка будет новым репозиторием, поэтому удалите текущий пульт.
git remote rm origin
Шаг 3
Извлечь историю желаемой папки и зафиксировать ее
git filter-branch --subdirectory-filter <directory 1> -- --all
Теперь у вас должен быть репозиторий git с файлами из directory 1
корня вашего репо со всей связанной историей фиксации.
Шаг 4
Создайте свой онлайн-репозиторий и продвигайте новый репозиторий!
git remote add origin <git repository B url>
git push
Возможно, вам потребуется установить upstream
ветку для вашего первого нажатия
git push --set-upstream origin master
Чистый <git repository A>
(необязательно, см. Комментарии)
Мы хотим удалить следы (файлы и историю фиксации) <git repository B>
из, <git repository A>
чтобы история для этой папки была только один раз.
Это основано на удалении конфиденциальных данных из github.
Перейдите в новую папку и
git clone <git repository A url>
cd <git repository A directory>
git filter-branch --force --index-filter 'git rm --cached --ignore-unmatch <directory 1> -r' --prune-empty --tag-name-filter cat -- --all
Замените <directory 1>
папкой, которую хотите удалить. -r
будет делать это рекурсивно внутри указанного каталога :). Теперь нажмите на origin/master
с--force
git push origin master --force
Уровень босса (см. Примечание ниже)
Создать подмодуль из <git repository B>
в<git repository A>
git submodule add <git repository B url>
git submodule update
git commit
Убедитесь, что все работает должным образом, и push
git push origin master
Заметка
После всего этого я понял, что в моем случае более целесообразно использовать npm для управления моими собственными зависимостями. Мы можем указать URL-адреса и версии git, см. URL-адреса git package.json как зависимости .
Если вы делаете это таким образом, хранилище вы хотите использовать в качестве требования должно быть модулем НПМ , поэтому он должен содержать package.json
файл , или вы получите эту ошибку: Error: ENOENT, open 'tmp.tgz-unpack/package.json'
.
tldr (альтернативное решение)
Возможно, вам будет проще использовать npm и управлять зависимостями с помощью URL-адресов git :
- Переместить папку в новый репозиторий
- запустить
npm init
в обоих репозиториях
- запустить
npm install --save git://github.com/user/project.git#commit-ish
там, где вы хотите, чтобы ваши зависимости были установлены