git & svn externals - окончательное решение еще? - PullRequest
20 голосов
/ 14 января 2011

это рабочий процесс, который я сейчас использую для своих проектов SVN (я никогда не использую ветви SVN, а некоторые проекты также активно работают над другими людьми):

  • на сервере, выполнитеначальный git svn fetch, что может занять несколько часов.Также создайте ветку 'build'.
  • на машине для разработки теперь выполняется быстро: git clone srv://project.git, git checkout build и git update-refs ..., git svn fetch для восстановления ссылки на репозиторий svn
  • работа, фиксация, работаcommit, ...
  • , чтобы проверить, что все нормально, git push build на сервер и запустить сборку в Hudson для этой ветви
  • , чтобы сохранить работу, чтобы я мог работать с ней издругой компьютер, также нажмите ветвь сборки
  • , когда все будет выполнено, объедините коммиты в логических шагах (например, по одному для каждой ошибки), подтвердите svn и сбросьте все как git checkout master, git merge build, git svn dcommit, git push, git checkout build, git rebase master, git push build

EnterSVN Externals.Я пробовал каждый скрипт здесь , но все они терпят неудачу.Мои внешние настройки настроены так:

/path/to/x x
/path/to/y/z y/z
/path/to/a/b.file a/b.file

, и сценарии делают такие вещи, как попытка создать /path/to/x в корне файловой системы и git svn fetch /path/to/x.Также отдельные файлы, кажется, вызывают больше проблем.(подвопрос 1: для какого формата svn: externals были написаны эти сценарии?)

Кажется, что сложно изменить один из сценариев для обработки моей ситуации и репликации структуры каталогов, которую я ищуправильно, но тогда я остаюсь с большой проблемой: если я изменяю файл в каталогах x и y / z, я не вижу способа объединить это в один коммит svn, и это одна из причин, по которой яначал использовать git.

Отсюда вопрос: есть ли способ, которым я могу воспроизвести вышеописанный рабочий процесс, используя только части определенного хранилища svn, таким образом, чтобы я мог выполнить svn dcommit вкорень?Я бы предпочел готовое к использованию решение, которое работает как на Linux, так и на Windows.

edit Я быстро взломал один из найденных скриптов и сделал его реплицирующим структуру каталоговСВН внешние.Я не могу клонировать отдельные файлы, но вот что выдает:

git svn clone -r HEAD srv://svn/repo/path/to/projects.sln
Initialized empty Git repository in xxx/projects.sln/.git/
Invalid filesystem path syntax: REPORT request failed on '/svn/repo/!svn/vcc/default':
  Cannot replace a directory from within at yyy/git/libexec/git-core/git-svn line 5114

подвопрос 2: нельзя ли получить один файл через git svn?

Ответы [ 2 ]

14 голосов
/ 05 апреля 2011

К сожалению, внешние возможности SVN довольно гибки. Я натолкнулся на несколько сценариев, которые обрабатывают их как , но также допускается. Поэтому я думаю, что некоторые из сценариев просто не работают в этом отношении.

Чтобы ответить на ваш второй вопрос: нет. 'git svn fetch' должен работать на поддереве репозитория Subversion, но это должно быть нечто, что он может рассматривать как ветвь. Единственное, что хорошо вписывается в эту парадигму - это каталог (например, trunk /). FWIW, Bazaar и Mercurial тоже страдают здесь. В конце концов, Subversion является просто версионной файловой системой, в то время как Git имеет первоклассную концепцию ветки. Это одно из тех несоответствий, которые мешают. : - (

1 голос
/ 31 января 2013

Просто еще одна заметка по второму подвопросу. Насколько я знаю, Subversion на сегодняшний день также не поддерживает SVN Externals для файлов, только папки. Поэтому я думаю, что такие записи в свойствах будут недействительными. Не знаю, есть ли какой-либо инструмент, который обрабатывает этот случай.

...