git-svn clone со странной организацией svn тегов - PullRequest
3 голосов
/ 28 февраля 2012

Я хочу клонировать дерево SVN в репозиторий git, используя git-svn.Я хотел бы сделать полный клон, включая теги и ветви, но у меня возникла проблема с организацией тегов.

папка SVN-тегов выглядит так:

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 ]

3 голосов
/ 29 февраля 2012

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

  • Измените базовый репозиторий 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 в папке с другим именем.

0 голосов
/ 13 мая 2012

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

...