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

17

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 reset --hard foo , что именно происходит?

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

    
задан John Bachir 12.11.2010 в 20:40
источник

3 ответа

11

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.

    
ответ дан cdhowie 12.11.2010 в 20:43
  • Это потому, что вы не используете права переустановки. git checkout my-branch; git rebase trunk; git svn dcommit; –  cdhowie 12.11.2010 в 21:03
  • Нет, это не так ... Я беру свою ветку, чтобы быть локальной ветвью темы, где вы сделали свою разработку, и trunk, чтобы быть именем удаленного svn trunk ref. –  cdhowie 15.11.2010 в 19:45
  • Я думал, вы пытаетесь объединить свою ветку в багажник? Соответствует ли моя ветвь удаленной ветке svn? –  cdhowie 15.11.2010 в 20:31
  • Обновлено, спасибо. –  cdhowie 16.11.2010 в 01:07
  • Отличный ответ. Для получения дополнительной информации см. Следующую страницу в Git Wiki - git.wiki.kernel.org/index.php/... –  Matt Passell 16.03.2011 в 23:08
Показать остальные комментарии
2

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

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

git checkout -b mybranch -t remotes/mybranch

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

    
ответ дан Piyush Srivastava 03.02.2013 в 01:27
  • Я попробовал это и git svn dcommit -n все еще говорит, что он будет связываться с trunk вместо ветки, которую я хочу –  John Peter Thompson Garcés 30.09.2015 в 23:30
  • Не так просто: «Гит выясняет, в какую ветвь ваши dcommits идут, ища кончик любой из ваших ветвей Subversion в вашей истории - у вас должен быть только один, и он должен быть последним с git- svn-id в вашей текущей истории ветвей. " git-scm.com/book/en/v2/... –  jgomo3 05.09.2016 в 01:39
1

Простой способ, если вы хотите 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
    
ответ дан kenorb 17.09.2013 в 11:44