Предварительно надо установить пакет git-filter-repo. В Linux он устанавливается из репозитория, в Windows через pip
git clone <url-to-original-repo> original-repo-migration
cd original-repo-migration
На всякий случай удаляем origin, чтобы случайно не запушить изменения на сервер
git remote remove origin
git-filter-repo --subdirectory-filter path/to/my-subdirectory --force
git remote add origin <url-to-new-repo>
# main/master в зависимости от того, как называется главная ветка
git push -u origin master
Мы работали работали, а потом решили, что то, что лежит в main мы выделяем в отдельную ветку для истории, а какую-то рабочую, которая далеко ушла, хотим сделать main. Заниматься слиянием нет смысла, поэтому хочется переименовать рабочую ветку в main.
В Gitlab надо предварительно убрать защиту ветки main. Сделать её не Default Branch и не Protected Branch
Потом попробовать переименовать ветку. В примере из branch в branch_old, но можно попытаться и в main (не проверено, потренируйтесь на тестовом репозитории).
#Checkout the branch locally.
git checkout branch
#Rename it locally
git checkout -b branch_old
#delete remote branch
git push --delete origin branch
#push the locally renamed branch to remote.
git push --set-upstream origin branch_old