Обновление: этот процесс настолько распространен, что команда git сделала это намного проще с помощью нового инструмента git subtree
. См. Здесь: Подкаталог Detach (перемещение) в отдельный репозиторий Git
Вы хотите клонировать ваш репозиторий, а затем использовать git filter-branch
для отметки всего, кроме подкаталога, который вы хотите
git clone /XYZ /ABC
(Примечание: репозиторий будет клонирован с использованием жестких ссылок, но это не проблема, поскольку жесткий cd /ABC
for i in branch1 br2 br3; do git branch -t $i origin/$i; done
git remote rm origin
или для всех удаленных ветвей: cd /ABC
for i in $(git branch -r | sed "s/.*origin\///"); do git branch -t $i origin/$i; done
git remote rm origin
WARNING: Ref 'refs/tags/v0.1' is unchanged
для всех тегов (поскольку все они были не связаны с подпроектом); Кроме того, после удаления таких тегов больше места будет исправлено. По-видимому, git filter-branch
должен иметь возможность переписывать другие теги, но я не мог проверить это. Если вы хотите удалить все теги, используйте git tag -l | xargs git tag -d
. --tag-name-filter cat --prune-empty
, чтобы удалить пустые коммиты и переписать теги (обратите внимание, что это должно будет удалить их подпись): git filter-branch --tag-name-filter cat --prune-empty --subdirectory-filter ABC -- --all
или, альтернативно, только переписать ветвь HEAD и игнорировать теги и другие ветви: git filter-branch --tag-name-filter cat --prune-empty --subdirectory-filter ABC HEAD
git reset --hard
git for-each-ref --format="%(refname)" refs/original/ | xargs -n 1 git update-ref -d
git reflog expire --expire=now --all
git gc --aggressive --prune=now
, и теперь у вас есть локальный репозиторий git подкаталога ABC со всей сохраненной историей. Примечание. Для большинства применений git filter-branch
действительно должен иметь добавленный параметр -- --all
. Да, это действительно - space - all
. Это должны быть последние параметры для команды. Поскольку Мэтли обнаружил, это удерживает ветви проекта и теги, включенные в новое репо.
Изменить: различные предложения из комментариев ниже были включены, чтобы убедиться, например, что хранилище фактически сокращено (что не было всегда раньше).