Детальне рішення
Дивіться примітку в кінці цієї відповіді (останній абзац) для швидкої альтернативи 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>
INTO<git repository A>
git submodule add <git repository B url>
git submodule update
git commit
Перевірте, чи все працювало так, як очікувалося і push
git push origin master
Примітка
Зробивши все це, я зрозумів, що в моєму випадку більш доцільно використовувати npm для управління власними залежностями. Ми можемо вказати URL-адреси та версії git, див. Пакети.json git URL-адреси як залежності .
Якщо ви робите це таким чином, сховище ви хочете використовувати в якості вимоги повинно бути модулем НПМ , тому він повинен містити package.json
файл , або ви отримаєте цю помилку: Error: ENOENT, open 'tmp.tgz-unpack/package.json'
.
tldr (альтернативне рішення)
Можливо, вам буде простіше використовувати npm та керувати залежностями за допомогою git urls :
- Перемістити папку до нового сховища
- запустити
npm init
всередині обох сховищ
- бігайте
npm install --save git://github.com/user/project.git#commit-ish
там, де хочете встановити ваші залежності