У меня есть веб-приложение, которое исследует другие веб-приложения особым образом. Он содержит некоторые веб-Demos в папке "Демос" и один из демо сейчас стоит это's собственное хранилище. Я хотел бы создать отдельный репозиторий для этого демо-приложение и сделать его <дель>подпакет</дел> субмодуль из основного репозитория, не теряя своей истории совершал.
Можно ли сохранить историю коммитов из файлов в хранилище'папки и создать репозиторий и использовать его в качестве субмодуль?вместо
Подробное Решение #
смотрите примечание в конце этого ответа (последний абзац) для быстрой альтернативой для Git подмодулей, используя НПМ ;)
В ответ, вы будете знать, как извлечь папку из репозитория и сделать git-репозиторий, а затем включая его в качестве субмодуль вместо папки.
Вдохновение от Герг Байер'ы статьи перемещение файлов из одного репозитория Git на другой, сохранение истории
В начале, у нас есть что-то вроде этого:
<git repository A>
someFolders
someFiles
someLib <-- we want this to be a new repo and a git submodule!
some files
В ниже шаги, я буду называть это someLib
как в <каталог 1>
.
В конце концов, у нас будет что-то вроде этого:
<git repository A>
someFolders
someFiles
@submodule --> <git repository B>
<git repository B>
someFolders
someFiles
Получите новую копию из репозитория в Сплит.
git clone <git repository A url>
cd <git repository A directory>
Текущая папка будет новый репозиторий так удалить удаленный.
git remote rm origin
Экстракт истории нужную папку и совершить его
git filter-branch --subdirectory-filter <directory 1> -- --all
Теперь у вас есть Git-репозиторий с файлами из каталога 1
в репо's с корнем все связанные с историей коммитов.
Создать свое онлайн-хранилище и нажмите на новый репозиторий!
git remote add origin <git repository B url>
git push
Вы, возможно, потребуется установить на "восходящей" ветви для первого толчка
git push --set-upstream origin master
<Git-репозиторий, а>
(необязательный, см. замечания)Мы хотим, чтобы удалить следы (файлы и фиксации истории) в <репозиторий Git Б>
с `<репозиторий Git символом> Так история для этой папки там только один раз.
Это основано на удаление конфиденциальных данных с 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
Заменить в <каталог 1> в папку, которую вы хотите удалить.
-рбудет делать это рекурсивно внутри указанного каталога :). Теперь нажмите на
происхождения/мастерс
- сила`
git push origin master --force
Создать субмодуль от <репозиторий Git Б>
в в <Git-репозиторий, а>
git submodule add <git repository B url>
git submodule update
git commit
Проверьте, если все работает как ожидалось, и "толчок"
git push origin master
После всего этого, я понял, в моем случае, что более целесообразно использовать НПМ вместо того, чтобы управлять своими зависимостями. Мы можем указать URL Git и версий, см. пакет.git-ссылки в JSON зависимостей.
Если вы делаете это таким образом, репозиторий, который вы хотите использовать в качестве требования должны быть НПМ модуль, поэтому он должен содержать пакет.JSON-файл, или вы'll получить это выдает ошибку: Error: ENOENT, открытой 'tпл.тгз-распаковка/упаковка.в JSON'
.
Вы можете найти его проще использовать НПМ и управление зависимостями с Git-ссылки:
Решение по @GabLeRoux патиссоны ветки, и соответствующие коммиты.
Простой способ клонировать и держать все лишние ветки и коммиты:
1 - Убедитесь, что у вас есть этот мерзавец псевдоним
git config --global alias.clone-branches '! git branch -a | sed -n "/\/HEAD /d; /\/master$/d; /remotes/p;" | xargs -L1 git checkout -t'
2 - клон удаленного, тянуть все ветки, менять пульт, фильтр каталога, нажмите
git clone [email protected]:user/existing-repo.git new-repo
cd new-repo
git clone-branches
git remote rm origin
git remote add origin [email protected]:user/new-repo.git
git remote -v
git filter-branch --subdirectory-filter my_directory/ -- --all
git push --all
git push --tags
GabLeRoux'ы решение работает хорошо, за исключением, если вы используете ГИТ ОРС
и имеет большие файлы в папке, которую вы хотите отключить. В этом случае после шага 3 все большие файлы останутся указателей файлов, а не реальные файлы. Я думаю, это's наверное из-за `.gitattributes файл быть удален в процессе отделения фильтра.
Понимая это, я нахожу следующее решение работает для меня:
cp .gitattributes .git/info/attributes
Копирование .gitattributes по которым ГИТ ОРС использует для отслеживания больших файлов
.каталог Git/`, чтобы избежать удаления.
Когда фильтр-ветви Дон'т забудьте положить обратно `.gitattributes ПО если вы все еще хотите использовать Git LFS для нового репозитория:
mv .git/info/attributes .gitattributes
git add .gitattributes
git commit -m 'added back .gitattributes'