Як git-svn клонувати останні n версії із сховища Subversion?


314

Проблема

Як ви створюєте дрібну копію з git-svn з сховища Subversion, наприклад, як витягуєте лише останні три версії?

git cloneКоманда може отримати останній п перегляди зі сховищ 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 .

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

git-клон

git-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
Що робити, якщо я хотів би продовжити клонування попередньої редакції в майбутньому, чи це можливо?
Zennichimaro

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 repo
Ian Oxley

команда svn log була саме тим, що я шукав! спасибі
mrbrdo

1
Репости, з якими я працюю, мають нестандартне розгалуження та компонування, тому я, як правило, створюю локальну ретопу Git для кожної гілки SVN, а потім cherry-pick/ rebaseміж ними. Коміт робить додатковий крок ( pushпотім dcommitвід віддаленого репо), але я думаю, що це варто компромісу.
chronospoon

Не задумувався над цим, можливо, буде швидше просто клонувати конкретні теги / гілки, як ви кажете :)
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.