Ответ 1
Короткий ответ
git filter-branch
предлагает именно ту функциональность, которую вы хотите. С помощью опции --subdirectory-filter
вы можете создать новый набор коммитов, где содержимое subDirectory
находится в корне каталога.
git filter-branch --prune-empty --subdirectory-filter subDirectory -- --branches
Walkthrough
Ниже приведен пример безопасного выполнения этого. Вам нужно выполнить это для каждого подкаталога, который будет изолирован от своего собственного репо, в этом случае 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-журналы. Если вы хотите отбросить данные, прочитанные как собирать мусор, комментирует.
Некоторые дополнительные ресурсы: