Я унаследовал репозиторий git, содержащий несколько проектов в отдельных каталогах. Я хотел бы разделить репозиторий на новые отдельные репозитории, по одному для каждого проекта, а затем сделать так, чтобы главный репозиторий содержал проекты в виде подмодулей. Я бы хотел сделать все это, по возможности сохраняя историю изменений отдельных проектов.
Я мог бы клонировать репозиторий для каждого проекта и каждый раз удалять все остальные проекты, но есть ли лучший способ избежать клонированной истории в каждом новом репозитории проектов?
git
git-submodules
посчитал
источник
источник
Ответы:
Вы можете использовать,
git filter-branch
чтобы переписать историю проекта. Из документации:Сделайте несколько копий своего репо, сделайте это для каждого подкаталога, который хотите разделить, и вы должны получить то, что ищете.
источник
--subdirectory-filter
несколько раз. EGgit filter-branch --subdirectory-filter foodir --subdirectory-filter bardir
и т. Д. Не--subdirectory
будут занимать несколько каталогов, но могут быть указаны несколько раз.foodir
в исходном проекте, а не переписывать его историю,git rm -r foodir
этого будет достаточно (это также приведет к удалению копии в вашем рабочем дереве; если вы этого не хотите, используйте--cached
). Если вы хотите полностью удалить его из истории (отвечая также на вопрос @ ilius), вам нужно что-то вродеgit filter-branch --index-filter 'git rm -r --cached --ignore-unmatched foodir' -- --all
--index-filter
решение работает быстрее--tree-filter
, поскольку ему не нужно фактически извлекать файлы, оно может просто напрямую манипулировать индексом. Однако--tree-filter
может быть немного проще использовать, поскольку вы можете использовать обычные операции файловой системы, а не работать с операциями манипулирования индексами.Для экспорта папки как нового репозитория вам необходимо:
Откройте папку клонированного репозитория и выполните эту команду:
источник
git subtree
недоступен как пакет Cygwin. Если вам это нужно: stackoverflow.com/a/27116828/2484903Суть git в том, что история воплощается в каждой фиксации путем хеширования родительской фиксации. Вы можете «воспроизвести» коммиты (по сути, так работает svn-importer) в новый репозиторий, сохранив только каждый подпроект. Это, однако, разрушило бы смысл хэшей фиксации. Если у вас нет проблем с этим, пусть будет так.
Раньше я просто клонировал его и двигался дальше. Это делает вещи больше, но дисковое пространство дешево; мое время дорого.
Я также не знаю никаких инструментов для создания каталога. Я полагаю, вы могли бы git-log в каталоге найти все коммиты в нем, а затем воспроизвести коммиты с помощью чего-то вроде git-fast-export?
источник