Разделение многих подкаталогов в новый, отдельный репозиторий Git
Этот вопрос связан с:
Вместо того, чтобы отделить один подкаталог, я хочу отсоединить пару. Например, вот моя структура папок:
/app1
/file1
/file2
/folder1
/folder2
/app2
/file3
/file4
/folder3
/folder4
/test
/file5
/file6
/folder5
/folder6
/README.md
/new_file
И я хотел бы это вместо этого:
/app1
/file1
/file2
/folder1
/folder2
/app2
/file3
/file4
/folder3
/folder4
Я попробовал следующие альтернативы, и никто не работал до сих пор:
git filter-branch --index-filter 'git rm --cached -qr -- . && git reset -q $GIT_COMMIT -- /app1/* app2/*' --prune-empty -- --all
Error:
pathspec '.' did not match any files
Вторая попытка:
git filter-branch --tree-filter "mkdir samples; mv app1 app2 samples/" HEAD
Error:
rename app1 to samples/app1: No such file or directory
Same error for the second sub-directory
Любые идеи?
Ответы
Ответ 1
В случае с древовидным фильтром вы будете оценивать script для каждой фиксации, даже совершать транзакции, когда app1 и app2 могут не существовать, это может быть разрешено защитой и альтернативной командой, которая не терпит неудачу.
git filter-branch --tree-filter "mkdir samples && test -d app1 && mv app1 samples/|| test -d app2 && mv app2 samples/ || echo 'nothing to do'" HEAD
Затем, создавая образцы корневого каталога, это переместит app1 и app2 в корень проекта.
git filter-branch -f --subdirectory-filter samples -- --all
Я рекомендую сначала сделать резервную копию.
Ответ 2
# safety play: do this in a scratch clone
git clone --mirror . ../redo
cd !$
# build the exact index you want:
git filter-branch --index-filter '
git read-tree --empty
git read-tree --prefix=app1/ $GIT_COMMIT:app1
git read-tree --prefix=app2/ $GIT_COMMIT:app2
' -- --all
... возможно, с --tag-name-filter cat
, чтобы указать старые теги при новом (переписанном) объявлении без изменения имен.