2012-06-07 3 views
2

Это мой нормальный рабочий процесс с GIT-SVN:мерзавец: более эффективный способ сделать это

  1. создать ветку для выпуска
  2. совершить после того, как делать какую-то работу по отрасли
  3. мастер фотографии
  4. СВН перебазироваться
  5. выезд филиал
  6. мастер перебазироваться
  7. мастер фотографии
  8. слияние филиал
  9. dcommit

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

Есть ли способ сделать это с меньшими шагами?

ответ

1

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

  1. Создать ветку для выпуска: git checkout -b issue remotes/trunk (что remotes/trunk может быть опущена, если я уже на ветке меня интересует).

  2. Проделайте определенную работу и зафиксируйте ее.

  3. Нажмите прямо в репозиторий Subversion: git svn dcommit. Это произойдет только в том случае, если файлы, которые вы отредактировали, были изменены. Если они есть, вы получите сообщение об ошибке, так что сделайте git svn rebase, затем повторите попытку git svn dcommit.

    Обратите внимание, что сначала не нужно объединять это в свою основную ветвь.

  4. Оформить заказ главная отрасль: git checkout master.

  5. Восстановить основную ветку: git svn rebase.

    При необходимости удалите ветвь проблемы; ведущие и выпускные ветви должны теперь быть идентичными, так как git svn dcommit делает сразу git svn rebase.

Вы можете выполнять команды git svn из любой ветки; система будет определять, где взять или переустановить, исходя из родительской ветви Subversion. Если вы хотите проверить, в чем заинтересована ветка Subversion, запустите git svn dcommit --dry-run

В частности, нет ничего особенного в ветке мастера. В самом деле, я часто игнорирую его и пропускаю шаги 4-5 выше. Я просто перейду из одной ветки в другую и никогда не буду прикладывать ветку мастера к подсказке Subversion.

+0

вы говорите, если Я клонируюсь из сундука, создаю локальную ветвь, выполняю работу и фиксирую, я могу переустанавливать из локальной ветви в туловище? Мне все равно нужно было бы переустановить мастера, не так ли? – hvgotcodes

+0

Я думаю, что сценарий, который вы описываете, - это то, где кто-то совершил изменения в удаленной соединительной линии Subversion, и вы совершили коммиты в своей локальной ветке «проблема», и вы хотите принять удаленные изменения. Если у вас обнаружена ветка «проблема» (т.е. «git branch» перечисляет ветку «проблема» со звездой рядом с ней), то да, 'git svn rebase' будет обновляться, чтобы ваша фиксация была поверх вершины Subversion trunk. Не нужно вообще прикасаться к «ведущей» ветке. –

+0

в высшей степени правый. Мое единственное беспокойство было бы, если бы я сразу работал над несколькими вопросами, все из мастера. Я полагаю, что я мог бы переустанавливать индивидуально, и полагаю, что, когда я объединю мастер, будет актуальным - т. Е. слияние ветки, которая была переустановлена ​​на мастер, приведет к обновлению мастера - это правильно? – hvgotcodes

1

У вас есть 2 вещи. Чтобы сохранить историю в одной прямой линии, вам нужно переустановить. Однако, rebasing подразумевает, что вы должны повторно применять изменения поверх другой базы кода. Это может создать цепочку разрешений конфликтов, которые вам могут понадобиться сделать для каждой фиксации, которую вы переустанавливаете.

Единственное, что я могу добавить, чтобы помочь вам в том, что, если вы пересоздали, вы знаете, что у вас будет ускоренное слияние. В этом случае вам не нужно проверять эту ветвь, чтобы переместить ее вперед. Таким образом, чтобы обновить ссылку, вы можете:

git push . my-branch:master 

Это обновит мастер, чтобы указать, где мой Гиса указывает на и будет работать только тогда, когда это быстро пересылаемый. К сожалению, это не поможет вам здесь, так как вам нужно быть в филиалах, чтобы выполнить необходимые действия.

Возвращаясь к вопросу о вашем рабочем процессе, у вас будет больше проблем с конфликтами, чем если бы вы просто слились.

+0

В этом рабочем процессе шаги 3-4 никогда не должны иметь проблемы слияния, так как мой мастер не изменился. правильно? так что может произойти слияние на 6, но там будет слияние на 8. Если бы я просто слился, есть вероятность конфликта - я думаю, что я говорю, должен быть не более одного конфликта – hvgotcodes

1

Вы можете попробовать SubGit вместо git-svn.

SubGit - это серверное решение. Он позволяет Git получить доступ к репозиториям Subversion, а также к доступу Subversion к репозиториям Git. Нужно установить SubGit в хранилище Subversion, то есть в основном добавить необходимые крючки, которые делают преобразование на каждом толчке и совершить:

$ subgit configure $SVN_REPOS 
$ # Adjust $SVN_REPOS/conf/subgit.conf 
$ #  to specify your branches and tags 
$ # Adjust $SVN_REPOS/conf/authors.txt 
$ #  to introduce svn author names to their git counterparts 
$ subgit install $SVN_REPOS 

После этого один есть репозиторий на $ SVN_REPOS/.git который непрерывно синхронизированный с Subversion коллега. Если для этого репозитория Git настроен удаленный доступ (например, через git-http-backend), можно использовать любой рабочий процесс Git и любой клиент Git с существующим хранилищем Subversion.

В вашем случае это будет выглядеть следующим образом:

$ git checkout -b foo 
$ git commit 
$ git checkout master 
$ git merge foo or git rebase foo 
$ git push 

Некоторые подробности:

  • SubGit гораздо выше, чем ГИТ-СВН с точки зрения слияния отслеживания, по окончании срока line, поддержка типа mime и т. д .;
  • SubGit - это коммерческий инструмент с некоторыми бесплатными опциями;
  • Я один из разработчиков SubGit.
Смежные вопросы