Похоже, у вас может быть устаревшее хранилище с папками в среде (вероятно, из TFS или что-то в этом роде?), И вы пытаетесь перейти на более git дружественную структуру с филиалами в среде вместо этого?
Если это так, и если вы планируете использовать git, это, вероятно, хорошая идея. Но имейте в виду, что совместное использование изменений между двумя в будущем не будет простым - так что это лучше всего работает, если вы можете перенести все в новую структуру и затем избавиться от старого репо.
Вы можете сделать это, используя параметр subdirectory-filter
git filter-branch
(https://git-scm.com/docs/git-filter-branch). (В текущих версиях git вы получите предупреждение, что они рекомендуют переключиться на другой инструмент под названием git filter-repo
; я еще не узнал об этом новом инструменте, и это достаточно простая операция с использованием filter-branch
, но вместо этого вы можете посмотреть filter-repo
документы.)
Например, вы можете создать новый B-repo
, содержащий историю 1-Branch
на
$ git clone --single-branch -b 1-branch A-repo ./B-repo
$ cd B-repo
$ git remote remove origin
, а затем создайте ветку develop
с помощью
$ git checkout -b develop
$ git filter-branch --subdirectory-filter develop --prune-empty -- develop
При необходимости вы можете повторить эту процедуру, чтобы создать ветки для каждой среды. Вам потребуется выполнить небольшую очистку между filter-branch
прогонами, чтобы удалить резервные ссылки, которые он создает, поскольку он не будет делать новый прогон, если есть предыдущая резервная копия.
$ git update-ref -d refs/original/refs/heads/develop
$ git checkout 1-branch
$ git checkout -b production
$ git filter-branch --subdirectory-filter production --prune-empty -- production
и т. Д. .
Как только вы создадите все новые необходимые ветки, вы удалите 1-Branch
из вашего нового репо.
$ git branch -D 1-branch
Если вы обнаружите, что слишком много места занято Теперь несуществующие 1-Branch
данные (которые все еще находятся в базе данных репо) вы можете очистить их несколькими способами. Вероятно, достаточно будет просто перенести новые ветки на удаленный компьютер, но я не вижу в документах ничего, чтобы это гарантировать. Точно так же вы можете просто повторно клонировать новое хранилище и , вероятно, , будут скопированы только данные новых веток, но опять же я не уверен, что это гарантированное поведение.
Для явного принудительного удаления можно удалить 1-Branch
reflog (и все последние original/*
refs) и затем запустить git gc
. Так как этот клон был создан только для создания новых веток, он не имеет ценных повторных флагов, поэтому вы можете безопасно удалить их все.
$ rm -rf .git/refs/original
$ rm -rf .git/logs
$ git gc --prune=now --force --aggressive