Git svn clone: как отложить выборку истории изменений
У меня часто случается, что я хочу работать в репозитории SVN сразу. Но обычный git svn clone [url]
также клонирует всю историю. Поэтому я хочу ускорить процесс. Первая часть - извлечь только последнюю ревизию в ваш репозиторий Git. Я делаю это так:
URL=http://google-web-toolkit.googlecode.com/svn/trunk/
REV=`svn info $URL |grep Revision: | awk '{print $2}'`
PROJECT_FOLDER=google-web-toolkit-readonly
git svn clone -r$REV:HEAD $URL $PROJECT_FOLDER
(дополнительная информация в статье StackOverflow: "Как git -svn клонировать последние n изменений из svn"
Таким образом, я работаю и могу работать немедленно. Но без местной копии истории.
Вопрос в том, как мне потом получить историю из репозитория svn?
И желательно, это можно сделать в кусках, скажем 1000 ревизий (в обратном порядке). Любая помощь здесь будет принята с благодарностью:)
Ответы
Ответ 1
Я узнал, как это можно сделать. Трюк не использовать git svn clone
. Вместо этого используйте git svn init
и git svn fetch
индивидуально. Изменен пример:
URL=http://google-web-toolkit.googlecode.com/svn/trunk/
REV=`svn info $URL |grep Revision: | awk '{print $2}'`
PROJECT_FOLDER=google-web-toolkit-readonly
mkdir $PROJECT_FOLDER
cd !$ #goes into dir named $PROJECT_FOLDER
git svn init -s $URL #-s implies --stdlayout with /trunk /tags /branches
git svn fetch -r $REV
# hack, hack, hack
# or update history (fetch 50 revisions back each loop
for (( r=$REV; r>0; r-=50 ));
do
git svn fetch -r $r:HEAD
done
Ответ 2
Ни один из предложенных ответов не будет работать. git svn fetch
с ревизией будет только получать более новые версии, чем то, что уже клонировано. Вы можете использовать git svn reset
, чтобы вернуться к старой версии и получить оттуда, но потом вам придется совершить какую-то грязную работу, чтобы "перевести" ваши новые версии обратно на полное дерево (SHA1 SVN ревизия в git зависит от всего содержимого ревизии). Если вам удобно скальпели, git
предлагает вам, пойдите для этого.
Намного проще избежать проблемы.
- Сделайте первоначальный клон последних нескольких изменений, чтобы вы могли немедленно работать,
- Начать другой клон полной истории в другой каталог / git репозиторий;
- Работайте в своей частичной истории столько, сколько хотите;
- Когда полный клон завершается, используйте такой подход, как http://www.sanityinc.com/articles/relocating-git-svn-repositories/, чтобы скопировать вашу работу из частичного репозитория на полный.
Итак, это частичный ответ - как вы можете получить историю? Заберите его в другое репо и скопируйте то, что вам нужно. Можно ли это сделать в кусках 1000 в обратном порядке? С помощью скальпелей и много терпения он мог, но это вряд ли стоило того. Полная пересылка выполняется вперед, чтобы обойти накладные расходы всех тех первых изменений, которые были захвачены каждым блоком git svn fetch
, и исправление будет утомительным.
Ответ 3
git svn fetch
, похоже, "помнит" изменения, которые он видел ранее. У меня был успех с диапазонами:
git svn fetch -r 0:100
git svn fetch -r 100:200
git svn fetch -r 4500
git svn rebase
git svn fetch -r 200:300
Я извлек последние изменения, а затем начал "заполнять" пробелы. Кажется, он работает нормально.
Jesper - если ваш репозиторий не имеет ревизии 1000, тогда нет ничего для его получения. Убедитесь, что номера версий, которые вы используете, действительны!