Как мне поддерживать svn: external в актуальном состоянии, используя git-svn? - PullRequest
51 голосов
/ 08 декабря 2008

Рассматривая мой репозиторий как репозиторий SVN, я получаю:

svn co http://myrepo/foo/trunk foo
...
foo/
  bar/
  baz/ -> http://myrepo/baz/trunk

Рассматривая его как репозиторий Git, я получаю:

git svn clone http://myrepo/foo --trunk=trunk --branches=branches --tags=tags
...
foo/
  bar/

Я могу клонировать базу на свой локальный компьютер в другом месте и добавить символическую ссылку, но это всего лишь взлом. Есть ли способ заставить git svn rebase автоматически извлекать эти изменения при обновлении всего остального, как это делает svn up?

Ответы [ 8 ]

24 голосов
/ 09 декабря 2008

Лучшее средство интеграции внешних svn с git-svn, которое я видел, это скрипт , который клонирует ваши внешние объекты в каталог .git_externals / и создает символические ссылки и исключает нужные вам файлы. Я считаю это простым и прямым решением. YMMV.

Вот старый обзор других опций для работы с svn externals с помощью git-svn. Мне они кажутся слишком сложными и могут сломаться при последующем использовании Git.

22 голосов
/ 23 января 2009

Решение, которое я использовал в итоге, заключалось в простой символической ссылке на другие git-svn клоны на моем локальном компьютере. Это сработало довольно хорошо: оно позволяет мне фиксировать изменения обратно, и позволяет мне вносить локальные изменения в проект А, чтобы просто включить их в проект Б.

4 голосов
/ 07 ноября 2011

Я только что написал короткий скрипт, который извлекает все svn:externals текущего HEAD в корневой каталог и исключает их из репозитория git.

Поместите его в .git/hooks/post-checkout, и он будет поддерживать эти внешние проверки в актуальном состоянии при каждом изменении рабочего дерева, например, из-за git svn rebase или git-checkout.

#!/bin/bash
set -eu

revision=$(git svn info | sed -n 's/^Revision: \([1-9][0-9]*\)$/\1/p')
git svn -r${revision} propget svn:externals | head -n-1 | {
    while read checkout_args
    do
        checkout_dirname=$(echo ${checkout_args} | cut -d' ' -f3)
        svn checkout ${checkout_args}
        if [ -z $(grep ${checkout_dirname} .git/info/exclude) ]
        then
            echo ${checkout_dirname} >> .git/info/exclude
        fi
    done
}
4 голосов
/ 09 апреля 2010

Я также сделал скрипт (доступны как варианты Perl, так и Ruby), который делает это для меня, он находится на http://github.com/liyanage/git-tools/.

  • Рекурсивно проверяет все svn: externals
  • Может быть запущен повторно, если клон большого хранилища прерывает работу на полпути. Случилось со мной много. Он начинает с того места, где остановился.
  • Добавляет все найденные и обрабатываемые записи svn: externals в .git / info / exclude
  • Добавляет все svn: игнорировать записи, которые он встречает в .git / info / exclude
  • Может запускаться регулярно после первого запуска, чтобы выполнить svn: rebase во всех клонированных вложенных песочницах, обнаружить новые внешние объекты и новый svn: ignores

Обновление: я больше не поддерживаю этот скрипт. Его функциональность для рекурсивного клонирования и обновления SVN-репозитория, а также другие функции, связанные с git, доступны в этом новом проекте, который я активно поддерживаю: http://liyanage.github.com/git-tools/

2 голосов
/ 21 января 2013

Только для записи: я следовал этому предложению и пытался использовать SmartGit для работы с svn:externals.

SmartGit - безусловно лучший клиент с графическим интерфейсом, который я когда-либо видел для Git. Что касается svn:externals, он не только корректно выбирает их, но также предоставляет возможность делать «быстрый снимок» (клон только для чтения, HEAD-only) внешних репозиториев.

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

1 голос
/ 03 августа 2015

Вот что я сделал.

Сначала я создал пустое хранилище SVN (для того же корня, что и в git):

svn checkout --depth empty http://path/to/repo .

Это создало пустой репозиторий SVN в корне Git. Дело в том, что он содержит внешние свойства SVN.

Далее я просто проверяю только внешние данные (я поместил в инструменты PATH cygwin):

svn propget svn:externals | sed -e 's/ / .\//' | sed -e 's/\'//g' | xargs -L1 svn co
1 голос
/ 10 марта 2012

попробуйте этот скрипт на питоне https://bitbucket.org/nytmyn/gitsvnext/overview

чтобы оформить svn externals, запустите следующее в вашем git-репозитории

python /../gitsvnext/run update

запустите это, чтобы знать, что поместить в .git / info / exclude

python /../gitsvnext/run list
1 голос
/ 18 августа 2009

Я решил написать «простой» скрипт на perl, чтобы справиться со всем этим для меня. Я недавно положил его на github, попробуйте, может быть, это поможет: http://github.com/sushdm/git_svn_externals/.

Он, по сути, выполняет клонирование git-svn для всех найденных внешних объектов, а также рекурсивно ищет их, клонирует, создает ссылки в соответствующих местах и ​​исключает все каталоги и символические ссылки .git_externals, так что вы все равно можете использовать «git svn dcommit».

Удачи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...