Что является корректным способом сделать удаленные ответвления/теги, которые существуют после мерзавца-svn init/git-svn выборка в локальные ответвления/теги Мерзавца прежде, чем продвинуть моему удаленному Мерзавцу repo и отказаться от 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/refs/remotes/svn/каталоге кроме пустого 6.x, 5.x, 4.x, 3.x, теги и каталоги архива. Я действительно проверял, что удаленные ответвления там с git branch -r
.
Кто-то предположил, что мне были нужны к систематически контролю все удаленные ответвления как локальные: git checkout -b
но я не получил категорический ответ нигде.
Я смог к conver теги при помощи этого сценария:
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
для каждой из папок тегов.
Для такой одноразовой операции, прежде чем оставлять репозиторий 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
Согласно ответу на список рассылки Git, мне не нужно преобразовывать эти ветки в локальные, прежде чем отправлять их в мое удаленное репо. Мне просто нужно сделать:
git push <remote_git_repo_name> svn/<branch-name>:refs/heads/<branch-name>