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


314

проблема

Как создать мелкую копию с помощью 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


6
Отвечая на мой собственный вопрос: -s is for --stdlayout which presumes the svn recommended layout for tags, trunk, and branches.(но у меня не получилось)
Себастьян Гриньоли

Как трудно было бы осуществить --depthдля git svn, так как поддержка уже есть. И он уже должен узнать последнюю версию с сервера?
Питер Кордес

Ответы:


238

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

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

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


5
что если я хотел бы продолжить клонирование более ранней версии в будущем, возможно ли это?
Зеннихимаро

5
@Zennichimaro: Вы можете сделать это, добавив еще один git-svnудаленный указатель на то же место и используя, git-svn fetchчтобы получить больше дерева. В этот момент вы должны использовать, git filter-branchчтобы перевести старое (частичное) дерево в правую ветвь.
Бен Джексон

Пол, есть ли у меня возможность получить последние версии, выполнив пошаговую миграцию из SVN в Git ( stackoverflow.com/questions/29161646/… )
SabareeshSS

1
SVN использует последовательные целые числа, чтобы идентифицировать ревизии, делая еще более тривиальным возвращение n
коммитов

Я думаю, что после -r отсутствует пробел. Например, git svn clone -r 1133: HEAD some / svn / repo
Gnana

92

Я часто использую следующее, чтобы получить ограниченное количество ревизий из нашего огромного дерева подрывной деятельности (скоро мы достигнем 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.


1
+1 от меня - помог мне обойти ошибку 128 У меня было клонирование всего репозитория SVN
Ian Oxley

команда svn log была именно тем, что я искал! спасибо
mrbrdo

1
Репозитории, с которыми я работаю, имеют нестандартное ветвление и макет, поэтому я обычно создаю локальное репозиторий Git для каждой ветви SVN, а затем cherry-pick/ rebaseмежду ними. Коммит делает дополнительный шаг ( pushзатем dcommitиз удаленного репо), но я думаю, что это стоит компромисса.
хроноспун

Я не думал об этом, может быть быстрее, просто клонировать конкретные теги / ветки, как вы говорите :)
VeenarM

34

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

Это даст трещину, наше репо имеет около 170 000 ревизий, и это занимает слишком много времени, чтобы сделать один проект, и у меня есть более 10 конкретных проектов в репо: | Учитывая только 3-4 года истории.
VeenarM

1
Спасибо, что поделились этим!
Кай Мечел
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.