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

Как git -svn знает, к какой ветки к dcommit?

My repo - 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-интеграция - это особый случай или нет.

4b9b3361

Ответ 1

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.

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

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

Ответ 2

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

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

git checkout -b mybranch -t remotes/mybranch

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

Ответ 3

Простой способ, если вы хотите выполнить dcommit 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