Подтвердить что ты не робот

Бесшовная установка git svn

Я являюсь пользователем git и счастливым.

Теперь я вынужден использовать svn, и я не очень счастлив это сделать. Не так удобно использовать git svn.

Итак, вот настройка, которую я бы хотел и чего хочу.

  • Я использую git repo, то есть git всеми способами со многими локальными ветвями.
  • Я регулярно создаю несколько ветвей в git и объединяюсь, пусть git обрабатывает все это.
  • Я хочу отправить выбранную ветвь git как ветвь svn со всем зеркальным отображением.
  • Когда я удаляю локальную ветвь svn с зеркалированием git, ветвь svn также удаляется.

Подчеркнута, что я хочу, чтобы git выполнял всю сложную работу слияния и ветвления и просто нажимал на svn и делал это хранилищем.

Похоже, я прошу учебник git -svn. За исключением того, что я много раз сталкивался с ними, и тем не менее, я сталкиваюсь с ошибками, в то время как я часто делаю git svn rebase и git svn commit, и всегда кажется, что он разговаривает только с сундуком.

То, что я хочу, это зеркальные команды svn отправленные и зеркальные ветки.

4b9b3361

Ответ 1

см. этот вопрос для введения в git svn branch и этот вопрос о том, как удалять удаленные ветки - или ниже для полного резюме основ git svn (включая информацию из упомянутых двух вопросов).

Чтобы дать вам более полное руководство (полная настройка для локальных и удаленных веток, коммандирование, объединение локальных ветвей - см. ниже горизонтальную линию только для настройки ветки), здесь, как легко работать с svn repo:

  • Инициализируйте локальное репо git с помощью git svn clone <url> либо с параметром -s (stdlayout), либо с параметрами --trunk, --tags, --branches, чтобы указать каталог туловища, тегов и ветвей внутри каталога svn.

-s означает, что svn repo имеет макет каталога, подобный этому

/trunk
/branches/new_feature
/branches/long_fix
/tags/0.0.9
/tags/0.1.0

Если нет, вы можете указать местоположение соединительной линии, ветвей и тегов с приведенными выше аргументами.

Когда вы клонируете репо, вы автоматически приземляетесь в локальную ветку с именем master, которая автоматически отслеживает багаж.

В этом вы делаете свои коммиты так же, как не знаете, что вы клонировали репо с помощью git svn, за исключением того, что вы не нажимаете commits:

  • Используйте git commit для совершения транзакций в вашей ветке
  • Используйте git branch <branch name> для создания локальных ветвей
  • Используйте git merge <branch name> для объединения изменений из локальных ветвей
  • и др.

Вам не нужно беспокоиться о том, что вы находитесь в git svn -repo, , пока не захотите нажать свои изменения.

Из вышеприведенной настройки у нас есть мастер локального ветки, который отслеживает соединительную линию. Таким образом, после совершения коммитов внутри локальной главной ветки они могут быть перенесены в магистраль с помощью следующей команды:

  • git svn dcommit (внутри вашего локального мастера)

(Обратите внимание на d в dcommit).

Чтобы проверить, где вы совершаете транзакции, выполните

  • git svn dcommit -n

Теперь идет интересная часть: создавайте ветки на вашей стороне, которые отслеживаются. На самом деле простое чтение вопроса выше, я просто скопирую и вставлю пример:

  • git svn branch -n -m "Branch for authentication bug" auth_bug

Обратите внимание, что этот пример имеет флаг -n, который выполняет только сухой запуск. Удалите этот флаг, чтобы сделать это по-настоящему. Команда создает ветку auth_bug в svn repo в каталоге ветвей, который вы указали выше, и

  • git checkout -b auth_bug auth_bug

создает локальную ветвь auth_bug (первый параметр) и позволяет ей следовать удаленной ветке auth_bug (второй параметр), которая сопоставляется с dir /branches/auth_bug в svn repo. Удаленная ветвь auth_bug существует, потому что вы создали ее с помощью команды git svn branch (и может быть любой другой уже существующей ветвью).

Внутри этого локального ветки auth_bug все ваши коммиты будут перенесены в реверс svn в ветвях dir /branches/auth_bug при выполнении git svn dcommit (проверьте его, добавив -n к команде.)

Чтобы удалить ветку (я еще не делал ее раньше), похоже, что git svn не обрабатывает это для вас, поэтому в соответствии с другим вопросом, вы должны непосредственно использовать команду svn:

  • svn rm $URL/branches/the_branch

Это удаляет ветвь из удаленного svn-репо, а затем вы должны удалить ее из локального репозитория git, в зависимости от того, что это была ветка (например, в приведенной выше команде) или тег:

git branch -D -r the_branch
rm -rf .git/svn/the_branch

или

git branch -D -r tags/the_tag
rm -rf .git/svn/tags/the_tag

Чтобы обновить ветвь с помощью изменений в ветке svn вверху ( "pull" ), вы можете переустановить свою ветку поверх изменения с помощью:

  • git svn rebase

Выполняет новые коммиты в svn, переустанавливает вашу ветку и воспроизводит ваши локальные коммиты (если есть).

Ответ 2

Интерактив git -svn, вы можете попробовать SubGit.

SubGit является двунаправленным серверным зеркалом git -SVN.

Если у вас есть локальный доступ к репозиторию Subversion, вы можете установить SubGit в него так:

$ subgit configure $SVN_REPOS
# Adjust $SVN_REPOS/conf/subgit.conf to specify your branches and tags
# Adjust $SVN_REPOS/conf/authors.txt to specify git & svn authors mapping
$ subgit install $SVN_REPOS
...
$ INSTALLATION SUCCESSFUL

SubGit преобразует репозиторий Subversion в Git (он работает и в противоположном направлении) и устанавливает привязки SVN и Git. В результате репозитории Subversion и Git синхронизируются: каждая фиксация и push запускают перехватчики, которые немедленно конвертируют входящие изменения.

Вот некоторые преимущества использования SubGit:

  • SubGit автоматически преобразует svn: игнорирует свойства в .gitignore файлы, svn: eol-style и svn: свойства mime-type в .gitattributes;

  • SubGit автоматически преобразует информацию отслеживания слияния из репозитория Git в правильные обновления свойств svn: mergeinfo;

  • Можно использовать любой клиент Git для работы с репозиторией Git на основе SubGit, все изменения немедленно распространяются на Subversion.

Подробнее см. Документация SubGit и git - svn.

И здесь описание того, как стандартные операции Git отражаются в репозитории Subversion:

  • Создайте ветвь foo и переместите ее в исходный репозиторий Git:

    $ git checkout -b foo master
    $ git commit -a -m "Implement feature foo"
    $ git push origin foo
    

    Как только нажимается, репозиторий Subversion получает ^/ветки/foo ветку, скопированную из ^/trunk с соответствующими изменениями.

  • Объединить ветвь foo с мастером:

    $ git checkout master 
    $ git merge foo
    $ git push
    

    В этот момент создается новая ревизия для ветки ^/trunk с соответствующими изменениями, включая svn: mergeinfo update:

    + /branches/foo:rX-rY
    
  • Удалить ветку из удаленного репозитория:

    $ git push origin +:refs/heads/foo
    

    После этого ^/branches/foo удаляется в репозитории SVN.

SubGit - это коммерческий продукт. Он бесплатный для открытых и академических проектов, а также для проектов с участием до 10 коммиттеров.

Отказ от ответственности: я один из разработчиков SubGit.