Как правильно преобразовать удаленные ветви и теги SVN в локальные ветви / теги Git во время миграции SVN в Git? - PullRequest
7 голосов
/ 08 июля 2010

Как правильно сделать так, чтобы удаленные ветви / теги, существующие после git-svn init / git-svn, загружали в локальные ветви / теги Git, прежде чем отправлять в мое удаленное Git-репо и вообще отказываться от SVN.

У меня есть:

  • Выполнить git svn init
  • Обновлен раздел svn-remote "svn" моего файла .git / config:

    url = file:///Users/Developers/git_transition/svn_repo
    fetch = cascade/trunk:refs/remotes/svn/trunk
    branches = cascade/branches/{5.0GA_CLEANUP,drag-n-drop-def-builder,help-text,hib-annotations,hibernate-annotations,image-editor,ldapconfig,liquibase,move-rename-prototype,progress-bar,progress-bar2,quartz-upgrade,recyclebin,rendering_metrics,shuttle_upgrade,spring3,web-services-no-nuller}:refs/remotes/svn/*
    branches = cascade/branches/{6.x,5.x,4.x,3.x,archive}/*:refs/remotes/svn/*
    tags = cascade/tags/{3.7.x,4.x,5.x,6.x,old-releases}/*:refs/remotes/svn/tags/*
    
  • Выполнить git svn fetch

Делает ли git-svn clone что-то помимо init / fetch, которое превращает эти ветви / теги в локальные?

Я попробовал совет для Pro Git , но в каталоге .git / refs / remotes / svn / ничего не было, кроме пустых 6.x, 5.x, 4.x, 3.x , теги и архивные каталоги. Я действительно проверил, что удаленные ветви там с git branch -r.

Кто-то предположил, что мне нужно систематически проверять все удаленные ветви как локальные: git checkout -b <local_branch_name> <svn_remote_branch_name>, но я нигде не получил однозначного ответа.

Я смог преобразовать теги с помощью этого сценария:

git for-each-ref --format="%(refname)" refs/remotes/svn/tags/6.x |
grep -v @ | while read tag; do GIT_COMMITTER_DATE="$(git log -1
--pretty=format:"%ad" "$tag")" GIT_COMMITTER_EMAIL="$(git log -1
--pretty=format:"%ce" "$tag")" GIT_COMMITTER_NAME="$(git log -1
--pretty=format:"%cn" "$tag")" git tag -m "$(git log -1
--pretty=format:"%s%n%b" "$tag")" ${tag#refs/remotes/svn/tags/6.x/}
"$tag"; done

для каждой папки тегов.

Ответы [ 5 ]

3 голосов
/ 09 июля 2010

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

git push <remote_git_repo_name> svn/<branch-name>:refs/heads/<branch-name>
3 голосов
/ 08 июля 2010

Для операции с одним выстрелом, подобной этой, перед тем, как оставить репо SVN, я бы хотел клонировать его, используя скрипт ruby ​​ svn2git

=== Примеры

Скажите, у меня есть этот код в SVN:

  trunk
    ...
  branches
    1.x
    2.x
  tags
    1.0.0
    1.0.1
    1.0.2
    1.1.0
    2.0.0

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

  $ git branch
  * master
  $ git branch -a
  * master
    1.x
    2.x
    tags/1.0.0
    tags/1.0.1
    tags/1.0.2
    tags/1.1.0
    tags/2.0.0
    trunk
  $ git tag -l
  [ empty ]

После того, как svn2git будет сделано с вашим проектом, вы получите вместо этого:

  $ git branch
  * master
    1.x
    2.x
  $ git tag -l
    1.0.0
    1.0.1
    1.0.2
    1.1.0
    2.0.0
1 голос
/ 28 декабря 2013

Нет простого / простого способа конвертировать ветки тегов SVN в собственные теги git после конвертации git svn. Существует множество сценариев для преобразования тегов SVN, но большинство из них просто помечают и удаляют соответствующие ветви вне ветви «master», поэтому новые теги не будут отображаться в истории коммитов, даже если «master» имеет коммиты, идентичные отмеченные.

Чтобы решить эту проблему, я написал собственную утилиту " git-svn-convert-tags ", которая находит и присваивает теги, идентичные SVN-тегам в ветви master. Логика проста: утилита сравнивает все коммиты в текущей ветви (например, «master») с заголовками ветвей тегов. При обнаружении идентичной бинарной фиксации назначается новый тег, а ветвь тега SVN удаляется. Используя этот подход, мне удалось успешно преобразовать теги во многих git-svn импортированных репозиториях в идеальный макет тегов git.

1 голос
/ 12 мая 2012

Чтобы сделать именно то, что вы хотите, просто используйте SubGit проект.Вы можете установить его в свой репозиторий SVN.Чтобы создать связанный Git-репозиторий (с тегами SVN, преобразованными в теги Git, svn: игнорирует .gitignore и т. Д.).Этот Git-репозиторий синхронизируется с SVN-репозиторием: когда вы отправляете в Git-репозиторий, эти изменения транслируются в SVN-репозиторий и наоборот.

Если вам нужно клиентское решение, я бы порекомендовалвам использовать SmartGit .Он также сохраняет концепции SVN в репозитории Git.

И что я бы не рекомендовал вам использовать, это git-svn.

0 голосов
/ 10 февраля 2012

Это пример того, как преобразовать одну из этих ссылок на ветки в тег:

# rename the branch reference
git branch -t rel_20101019 remotes/svn/tags/rel_20101019

# checkout the branch
git checkout rel_20101019

# create the tag for it
git tag rel_20101019

# go back to master
git checkout master

# delete the branch
git branch rel_20101019 –d

# now you can push your branch and tag changes to your origin
git push origin –all
git push origin –tags
...