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.

Другие вопросы по тегам