SubGit: Как исключить ветки?

Я тестирую SubGit как способ перехода с SVN на Git.

Что я хотел бы сделать, так это иметь возможность создавать удаленные ветки в репозитории git, которые могут использовать все пользователи, которые не синхронизируются обратно с SVN.

Я только хочу, чтобы SubGit отслеживал основную ветку и синхронизировал ее с SVN, чтобы у нас была свобода использовать и делиться другими ветками Git.

Есть ли простой способ сделать это?

Спасибо


person David J    schedule 16.05.2013    source источник


Ответы (1)


Идеальным решением было бы указание сопоставления trunk:refs/heads/master в конфигурации SubGit., поэтому SubGit будет синхронизировать trunk с master, игнорируя любые другие ветки.

К сожалению, на данный момент SubGit нуждается как минимум в одном сопоставлении веток (версии 1.0.x и 2.0.x). То есть нужно указать что-то вроде этого:

trunk = trunk:refs/heads/master
branches = branches/*:refs/heads/*
shelves = shelves/*:refs/shelves/*
tags = tags/*:refs/tags/*

Поскольку вы не собираетесь синхронизировать все ветки Git, рассмотрите возможность использования специального пространства имен для обхода проблемы:

trunk = trunk:refs/heads/master
branches = branches/*:refs/gitsvn/heads/*
...

Таким образом, если ветку master отправить в центральный репозиторий Git, она будет переведена в trunk. Однако, если кто-то отправляет ветку foo, SubGit игнорирует эту ветку, поскольку refs/heads/foo находится вне области синхронизации.

Проблемы возникают из-за коммитов слияния: если коммит A является результатом слияния ветки foo в master, то SubGit создает branchs/foo на стороне Subversion. для соответствующего родителя коммита A. Если вы предпочитаете не включать ветки, сгенерированные SubGit, в пространство имен *branches/**, рассмотрите возможность использования некоторых специальных ветвей на стороне Subversion:

trunk = trunk:refs/heads/master
branches = gitsvn/branches/*:refs/gitsvn/heads/*
shelves = shelves/*:refs/shelves/*
tags = gitsvn/tags/*:refs/gitsvn/tags/*

В этом случае тот же родитель коммита A должен быть отправлен в ветку gitsvn/branches/foo.

Это лучшее решение, доступное на данный момент. У нас также есть запрос функции для версии 2.1, которая позволила бы вам найти идеальное решение, но это займет некоторое время, прежде чем мы его реализуем.

Обновление SubGit 3.0:

Начиная с версии 3.0.0 (на данный момент стадия раннего доступа, скачать по адресу http://subgit.com/eap) SubGit поддерживает макет с одной веткой, поэтому файл конфигурации может выглядеть следующим образом:

  1. Без ствола, без веток, без тегов и без полок:

    [svn]
        url = http://host.com/repos/project
    

    В этом случае каталог project сопоставляется напрямую с веткой master в репозитории Git; SubGit игнорирует любые другие ветки и никогда не создает полки, что означает, что анонимные ветки Git не синхронизируются с SVN.

  2. Один багажник, без полок:

    [svn]
        url = http://host.com/repos/project
        trunk = trunk:refs/heads/master
    

    В этом случае каталог project/trunk сопоставляется с веткой master в репозитории Git; SubGit игнорирует любые другие ветки и никогда не создает полки.

  3. Один багажник с полками:

    [svn]
        url = http://host.com/repos/project
        trunk = trunk:refs/heads/master
        shelves = shelves/*:refs/shelves/*
    

    В этом случае каталог project/trunk сопоставляется с веткой master в репозитории Git; SubGit игнорирует любые другие ветки, но переводит анонимные ветки на полки, как по умолчанию для версий 1.0.x и 2.0.x.

Надеюсь, это поможет.

person vadishev    schedule 16.05.2013
comment
Спасибо за ответ. Тем временем я поиграл с этим и придумал помещать все мои ветки только для git (например, foo) в отдельный удаленный голый репозиторий, а затем при необходимости объединять foo с master, а затем возвращать вещи обратно в репозиторий синхронизации. - person David J; 16.05.2013
comment
Как дела с упомянутым ideal solution? Я открыл новый вопрос, связанный с этим, так как я хотелось бы, чтобы ветки git НИКОГДА не отражались в svn. Спасибо - person ThanksForAllTheFish; 13.03.2014
comment
Это все еще продолжается. Такой макет полностью поддерживается в направлении svn-to-git, но есть определенные пограничные случаи, с которыми нам приходится иметь дело при преобразовании коммитов Git в версии SVN. В любом случае, эта функция находится в верхней части нашего списка приоритетов на данный момент. - person vadishev; 14.03.2014
comment
Есть ли ссылка на билет, который вы могли бы предоставить, так как я был бы очень заинтересован в этой функции. - person Jon Cage; 30.01.2015
comment
@JonCage Пожалуйста, посмотрите обновление, которое я только что отправил. В версии 3.0 мы представили чрезвычайно гибкую поддержку компоновки, так что можно использовать одно сопоставление веток для зеркала или что-то вроде branches/1.2.*/*:refs/heads/1.2.x/*/* и многое другое. Мы находимся в процессе обновления документации по новым функциям, для получения более подробной информации свяжитесь с нами по адресу [email protected] или задайте дополнительные вопросы здесь, в stackoverflow. - person vadishev; 02.02.2015
comment
Когда я изначально создавал репозиторий subgit для синхронизации svn-git, я создал его с ветками и полками, добавленными в конфигурацию. Через некоторое время я понял, что установка у меня не работает, и я просто закомментировал ветки и полки, но синхронизация для них все еще происходит (при нажатии на SVN). Может быть, конфиг читается и запоминается только при первоначальной настройке репо? - person userfuser; 03.01.2018
comment
@userfuser Невозможно обновить сопоставление ветвей для репозитория Git, где SubGit уже установлен. Самый простой способ — переустановить SubGit, выполнив стандартные этапы настройки. Для получения дополнительной информации посетите здесь. - person csonuryilmaz; 11.06.2019