Как git -svn клонировать последние n ревизий из репозитория Subversion?

Проблема

Как вы создаете мелкую копию с git -svn из репозитория Subversion, т.е. как вы извлекаете только последние три ревизии?

Команда git clone может получить последние n ревизий из репозитория Git, если вы используете опцию --depth, т.е. вы получите мелкую копию репозитория. Пример:

git clone --depth 3 git://some/repo myshallowcopyrepo

Есть ли аналогичная опция для git -svn?

Мои открытия пока

До сих пор я только нашел параметр -rN, где N - это ревизия для pull. Пример:

git svn clone -rN svn://some/repo

В соответствии с документацией есть возможность использовать -r $REVNUMBER: HEAD. Я попробовал следующее, чтобы получить последние 3 ревизии, которые возвратили сообщение об ошибке.

$ git svn clone --prefix=svn/ -s -rHEAD~3:HEAD http://some/svn/repo .
revision argument: HEAD~3:HEAD not understood by git-svn

Итак, я заменил HEAD ~ 3 фактическим числом третьей, но последней ревизии 534. Это сработало, но для этого мне нужно сначала выяснить номер версии третьего, но последнего фиксации.

$ git svn clone --prefix=svn/ -s -r534:HEAD http://some/svn/repo .

Documentation

git-clone

git-svn

Ответ 1

Вы уже обнаружили самый простой способ указать неглубокий клон в Git -SVN, указав номер версии SVN, который вы хотите запустить клон (-r$REV:HEAD).

Например: git svn clone -s -r1450:HEAD some/svn/repo

Git структура данных основана на указателях в направленном ациклическом графе (DAG), что делает его тривиальным для перехода назад n. Но в SVN (и, следовательно, в Git -SVN) вам придется самостоятельно найти номер версии.

Ответ 2

Я часто использую следующее, чтобы получить ограниченное количество ревизий из нашего огромного дерева подрывной деятельности (мы скоро достигнем версии 35000 svn).

# checkout a specific revision
git svn clone -r N svn://some/repo/branch/some-branch
# enter it and get all commits since revision 'N'
cd some-branch
git svn rebase

И хороший способ узнать, где началась ветка, - это сделать svn log и найти первый на ветке (последний, указанный при выполнении):

svn log --stop-on-copy svn://some/repo/branch/some-branch

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

Ответ 3

... 7 лет спустя, в пустыне, перекати-поле удары...

Я не был удовлетворен принятым ответом, поэтому я создал несколько сценариев, чтобы сделать это для вас доступный в Github. Они должны помочь любому, кто хочет использовать git svn clone, но не хочет клонировать весь репозиторий и не хочет искать определенную ревизию для клонирования из середины истории (возможно, вы клонируете кучу РЕПО). Здесь мы можем просто клонировать последние N ревизий:

Используйте git svn clone для клонирования последних 50 версий

# -u    The SVN URL to clone
# -l    The limit of revisions
# -o    The output directory

./git-svn-cloneback.sh -u https://server/project/trunk -l 50 -o myproj --authors-file=svn-authors.txt

Найти предыдущую версию N из репо SVN

# -u    The SVN URL to clone
# -l    The limit of revisions

./svn-lookback.sh -u https://server/project/trunk -l 5