Короткий ответ
git filter-branch
предлагает именно те функции, которые вам нужны. С опцией --subdirectory-filter
вы можете создать новый набор коммитов, где содержимое subDirectory
находится в корне каталога.
git filter-branch --prune-empty --subdirectory-filter subDirectory -- --branches
Прохождение
Ниже приведен пример безопасного выполнения этого действия. Вам нужно выполнить это для каждого подкаталога, который будет изолирован в своем репозитории, в данном случае dir1
.
Сначала клонируйте свой репозиторий, чтобы сохранить изменения изолированными:
git clone yourRemote dir1Clone
cd dir1Clone
Чтобы подготовить клонированный репозиторий, мы пересоздадим все удаленные ветки как локальные. Мы пропускаем ветку, начинающуюся с *
, так как это текущая ветвь, которая в данном случае будет читаться как (no branch)
, так как мы находимся в безголовом состоянии:
# move to a headless state
# in order to delete all branches without issues
git checkout --detach
# delete all branches
git branch | grep --invert-match "*" | xargs git branch -D
Чтобы воссоздать все удаленные ветки локально, мы просматриваем результаты git branch --remotes
. Мы пропускаем те, которые содержат ->
, так как это не ветки:
# get all local branches for remote
git branch --remotes --no-color | grep --invert-match "\->" | while read remote; do
git checkout --track "$remote"
done
# remove remote and remote branches
git remote remove origin
Наконец, запустите команду filter-branch
. Это создаст новые коммиты со всеми коммитами, которые касаются подкаталога dir1
. Все ветки, которые также касаются этого подкаталога, будут обновлены. В выводе будут перечислены все ссылки, которые не были обновлены, что имеет место для ветвей, которые вообще не касаются dir1
.
# Isolate dir1 and recreate branches
# --prune-empty removes all commits that do not modify dir1
# -- --all updates all existing references, which is all existing branches
git filter-branch --prune-empty --subdirectory-filter dir1 -- --all
После этого у вас будет новый набор коммитов с dir1
в корне репозитория. Просто добавьте свой пульт, чтобы отправлять новые коммиты, или вообще используйте их как новый репозиторий.
В качестве дополнительного последнего шага, если вам важен размер репозитория:
Даже если все ветки, в которых был обновлен ваш репозиторий, по-прежнему будут иметь все объекты исходного репозитория, но доступны только через ref-журналы. Если вы хотите удалить их, прочитайте как собирать коммиты
Некоторые дополнительные ресурсы:
person
Maic López Sáenz
schedule
27.12.2013