Intereting Posts
если обновление svn испортило мою локальную среду, как откат? Получение полного дампа репозитория CVS Android Studio не дает возможности добавить новую активность Ошибка сервера Dreamhost SVN: E175002 Проверить доступность функции watchOS 3 Xcode 8 vs watchOS 2 в объективе c Как установить настройки IntelliJ / Pycharm под управлением версии? Должен ли я хранить двоичные активы под TFS? Как? Gitflow с исправлением Semver / незначительным обновлением до более раннего тега Can 'svn switch' будет медленнее, чем 'rm -rf && svn checkout'? Как я могу отслеживать версию каждого проекта в решении Visual Studio с использованием единственного репозитория SVN? Как я могу сказать git, который vim использовать? Нужен совет по моему решению для разработки PHP subversion upgrade 1.6 -> 1.7 несовместимость инфраструктуры перехватчиков TortoiseSVN: как настроить проекты на существующую структуру каталогов исходного кода Можно ли вернуться к какой-либо фиксации без сброса – hard?

SVN для миграции Git: импортируйте только определенные филиалы и историю

Моя команда готовится к миграции в Git, и мы хотели бы начать с небольшого репозитория. Первоначальный репозиторий Git, созданный gitsvn, составляет около 10 ГБ из-за двоичных файлов и сотен ветвей версий.

Очистка больших файлов легко, сложной частью, по-видимому, является количество ветвей.

Для миграции git мы хотели бы начать в определенный момент времени (X) только с определенными (новейшими) ветвями. У нас нет «туловища» – но вместо этого разные ветви версий, которые поддерживаются в течение более длительного периода времени:

---- Version 1 ------------------------ \---------- Version 2-------------- \--------- Version 3---- 

Я легко узнал, как очистить большие капли от истории (BFG, git filter-branch).

Мой вопрос:

Как мы можем удалить все ветви, кроме нескольких конкретных из истории, так что у нас есть только, скажем, ветка «версия 3» в новом репозитории? В идеале нам бы хотелось, чтобы история начиналась с начала commit, где была создана эта ветка:

  --------- Version 3---- 

Есть ли способ сделать это с помощью git filter-branch или другой возможностью?

Solutions Collecting From Web of "SVN для миграции Git: импортируйте только определенные филиалы и историю"

Импортируйте весь репозиторий в Git, а затем выбросьте ветки, которые вам не интересны.

Отброшенная часть была бы интересной: D Как мы можем выбросить их и искоренить их из истории репо?

Ну, как работает Git, ветви – это просто указатели на фиксацию в истории репозитория. Филиалы существуют, потому что эти указатели существуют, чтобы указать на них. Если вы удалите указатели, ветки просто исчезнут. И если ничего не указывает на эти коммиты, коммиты по существу удаляются из репозитория.

Теперь рядом с ветвями есть еще одна важная вещь, которая обычно указывает на фиксации и держит вокруг: Новее совершает в зависимости от них. История Git – это большое ациклическое дерево, в котором каждая фиксация имеет родительский объект, на который указывает. Тем самым старые фиксации сохраняются, даже когда ни одна ветвь явно не указывает на них; и тем самым вся история работает.

Поэтому, если вы хотите избавиться от целой строки коммитов (отдельная ветка), и эти коммиты в какой-то момент не были объединены в другую ветку, тогда все, что вам нужно сделать, это удалить ветку из репозитория. Тогда ничто не укажет на строку коммитов, и они будут удалены при сборе мусора – собрать репозиторий:

 git branch -D Version_1 git branch -D Version_2 git gc --prune=now 

Это принудительно удалит ветви Version_1 и Version_2 из репозитория, а затем запустит сбор мусора, который удаляет каждый объект из репозитория, который не имеет указателя, указывающего на него.

Впоследствии у вас есть полная история для Version_3 , включая те части из двух других версий, которые являются частью ее истории. Если вы также хотите удалить это, вы можете применить метод, объясненный в этом вопросе, для удаления старой истории до точки перехода версии 3.

Я знаю, что это уже несколько лет, но на тот случай, если кто-то ищет ответ, чтобы выбрать только несколько ветвей, которые не связаны с клонированием всего:

Инициировать git-репо с URL-адресом SVN в папке tmp

 git svn init -T <main_branch_name> <repo_url> tmp 

Обновите файл .git / config, чтобы клонировать только определенные ветви. В этом случае мы собираемся клонировать только ветви, соответствующие шаблону feature*

 [svn-remote "svn"] noMetadata = 1 url = <repo_url> fetch = trunk:refs/remotes/origin/trunk branches = branches/feature*:refs/remotes/origin/* ## Added line 

Теперь вы можете получать файлы из репозитория SVN

 git svn fetch -r $NUMBER:HEAD 

Больше информации: