Откуда git-svn знает, в какую ветвь dcommit? - PullRequest
17 голосов
/ 12 ноября 2010

Мой репозиторий SVN, и я делаю всю разработку с помощью git.У нас есть стандартный макет, и я инициализировал свое локальное репо с git svn init -s <url to repo>

Вот мой рабочий процесс для работы с ветками:

# creates a new branch remotely
git svn branch new-branch-name

# switches to a branch or trunk locally
git reset --hard name-of-branch
git reset --hard trunk

# merge changes from trunk into a branch
git reset —hard name-of-branch
git merge trunk
git svn dcommit

Эта последняя команда, приведенная выше, зафиксирует изменения в ветвиимя-отрасли.У меня вопрос, откуда Git это знает?Когда я делаю git reset --hard foo, что именно происходит?

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

Ответы [ 3 ]

11 голосов
/ 12 ноября 2010

git-svn будет искать дерево коммитов для коммитов предков, которые соответствуют активным ветвям SVN (ветки refs/remotes/..., которые соответствуют ветвям в SVN).Затем он будет передавать их.

Обратите внимание, что вам не следует объединяться, а затем выполнять dcommit - модели ветвления SVN и Git не совпадают, и подобные вещи могут испортить историю SVN.Вместо этого вы должны git rebase trunk, когда вы находитесь на ветке.(В качестве альтернативы git svn rebase.)

Также имейте в виду, что ветвь, которую вы проверяете до перебазирования, должна быть локальной веткой.Если это не так, вы можете создать его с помощью git checkout -b local-branch-to-create remote-branch.Тогда git rebase trunk.

Если вы хотите раздавить все коммиты, которые были перебазированы в один, то сделайте это после перебазирования: git reset --soft trunk && git commit.

Как только вы будете довольны коммитамикоторые теперь живут поверх транка, просто git svn dcommit, чтобы отправить их на сервер SVN.

2 голосов
/ 03 февраля 2013

Разве это не так просто, как создать локальную ветку и отслеживать удаленную ветку svn? Когда вы делаете git svn init --stdlayout url-of-svn-repo, git отключает весь репозиторий SVN, сжимает его, чтобы он работал с git.

После этого просто нужно сделать что-то вроде:

git checkout -b mybranch -t remotes/mybranch

Если у вас есть локальный филиал, отслеживающий удаленный филиал, git svn dcommit отправляет только отслеживаемый удаленный филиал.

1 голос
/ 17 сентября 2013

Простой способ, если вы хотите ввести git master в svn trunk, попробуйте следующие команды:

git checkout master
git rebase trunk
git svn info # To verify that you're on the right branch
git svn dcommit

То же самое, когда в другой ветке (например, 6.x)

git checkout 6.x
git rebase 6.x # or git rebase remotes/6.x
git svn info
git svn dcommit
...