git & svn externals - окончательное решение?

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

  • на сервере выполните начальное git svn fetch, что может занять несколько часов. Также создайте ветку build.
  • на машине для разработки клонирование теперь выполняется быстро: git clone srv://project.git, git checkout build, за которым следует git update-refs ..., git svn fetch, чтобы восстановить ссылку на репозиторий svn
  • работа, фиксация, работа, фиксация, ...
  • чтобы проверить, все ли в порядке, 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

Введите svn 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 Я быстро взломал один из найденных мной скриптов и заставил его копировать структуру каталогов внешних файлов svn. Однако я не могу клонировать отдельные файлы, вот вывод:

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?


person stijn    schedule 14.01.2011    source источник
comment
Я обнаружил, что этот скрипт работает с текущими версиями SVN и Git.   -  person Ivan Koblik    schedule 01.11.2013
comment
@IvanKoblik благодарит за это. Хотя я должен признать, что просто отказался от синхронизации всех репозиториев, вместо этого вынудил всех коллег просто использовать git: P   -  person stijn    schedule 01.11.2013
comment
После некоторого использования, даже со сценарием, он становится очень громоздким. Я думаю, что git-svn не подходит для репозиториев SVN с внешними компонентами, ваше решение - лучшее из существующих.   -  person Ivan Koblik    schedule 01.11.2013


Ответы (2)


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

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

person John Szakmeister    schedule 05.04.2011

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

person agross    schedule 31.01.2013
comment
Будучи основным PITA (особенно при попытке связать SVN с Git), внешние файлы в SVN вполне возможны. Я не знаю с каких пор, но каждый клиент командной строки SVN, поставлявшийся с Xcode, начиная с версии 4.5 как минимум, был таков, а они, как правило, сильно устарели. - person danyowdee; 08.05.2014
comment
Для правильной работы внешних файлов IIRC требуется версия 1.8 или новее как на клиенте , так и на сервере. - person PMF; 04.11.2014