Как git-svn клонировать последние n ревизий из хранилища Subversion? - PullRequest
308 голосов
/ 14 апреля 2009

Задача

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

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

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

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

Мои открытия до сих пор

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

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 .

Документация

ГИТ-клон

ГИТ-SVN

Ответы [ 3 ]

230 голосов
/ 14 апреля 2009

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

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

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

89 голосов
/ 27 февраля 2010

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

# 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.

30 голосов
/ 26 февраля 2016

... 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     
...