Как создать ветку из существующей папки в существующей ветке в репозитории git? - PullRequest
0 голосов
/ 29 марта 2020

Как создать ветку из существующей папки, присутствующей в другой ветке в git хранилище? Например:

Существующее имя репозитория: A_repo

Имя филиала: 1- Филиал

Папки: Разработка, Обслуживание, Производство, Непроизводственное

Сейчас мне нужно создать ветку Develop из папки Develop (присутствует в A_Repo) в новом репозитории B_Repo.

Спасибо и С уважением,

Swagath

1 Ответ

1 голос
/ 29 марта 2020

Похоже, у вас может быть устаревшее хранилище с папками в среде (вероятно, из 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
...