git-svn clone со странной организацией svn тегов
Я хочу клонировать дерево SVN в репозиторий git с помощью git-svn. Я хотел бы сделать полный клон, включая теги и ветви, но у меня возникла проблема с организацией тегов.
папка SVN tags выглядит следующим образом:
tags/
|-- Backup
| |-- 20080212
| `-- 20080217
|-- V4.0.1
|-- V4.0.2
`-- V4.0.3
Я знаю о git svn clone -T trunk -b branches -t tags/Backup -t tags
с двойным -t
вариант, но это не совсем удовлетворительно:
$ git branch -r
tags/20080212
tags/20080217
tags/Backup
tags/V4.0.1
tags/V4.0.2
tags/V4.0.3
trunk
Как видите, все теги здесь, но одного слишком много: резервный тег на самом деле не тег, а папка, содержащая теги. Проблема в том, что он создает потерянную ветвь, которая дублирует содержимое всех резервных веток.
Вопрос в том, как заставить git-svn игнорировать папку резервного копирования, но знать о подпапках резервного копирования как теги, сохраняя классические теги доступными?
И в качестве бонуса: как автоматически назвать теги резервного копирования как Backup/20080217
вместо 20080217
?
Спасибо!
2 ответа
git svn
недостаточно интеллектуален, чтобы игнорировать папку Backup в одной группе тегов, но включает ее подпапки. У вас есть куча вариантов, ни один из которых не хорош
Измените базовый репозиторий Subversion, чтобы переместить все теги в подпапки, чтобы ваш репозиторий выглядел примерно так:
tags/ |--Backup/ | |--20080212 | `--20080217 `--Versions/ |--V4.0.1 |--V4.0.2 `--V4.0.3
Вы можете использовать
-t tags/Backup -t tags/Versions
подобрать все метки.Справиться. Несмотря на раздражение, способ, которым Git управляет объектами дерева, означает, что наличие тега "Backup" на самом деле не займет больше места или замедлит большинство операций Git; единственное влияние будет
git svn fetch
Это займет больше времени.Написать свой патч для
git-svn
чтобы включить обработку этого сценария. Бонусные баллы, если они будут включены в будущие официальные релизы Git.
Получить теги с другим именем довольно легко, по крайней мере. Если вы редактируете свой .git/config
файл, вы должны найти строку, которая выглядит примерно так:
tags = tags/Backup/*:refs/remotes/tags/*
Вместо этого вы сможете изменить это на следующее:
tags = tags/Backup/*:refs/remotes/tags/Backup/*
Если вы делаете это между бегом git svn init
и первый git svn fetch
, все должно просто работать. В противном случае вам может понадобиться сначала вручную удалить старые ссылки, удалив любые файлы или папки с именем, совпадающим с именем тега в .git/logs/refs/remotes/tags/
, .git/svn/refs/remotes/tags/
а также .git/refs/remotes/tags
,
Я понятия не имею, что произойдет, если у вас есть тег с именем "Backup" и папка с тегами "Backup". Я не подозреваю ничего хорошего. Вам нужно будет найти способ избежать этого или сохранить теги Backup в папке с другим именем.
Используйте SmartGit для клонирования репозитория, он создает правильные теги, обеспечивает лучший перевод и работает быстрее, чем git-svn.