Git svn clone: ​​как отложить выборку истории изменений - PullRequest
31 голосов
/ 12 октября 2009

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

Ответы [ 3 ]

22 голосов
/ 13 октября 2009

Я узнал, как это можно сделать. Хитрость в том, чтобы не использовать 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
5 голосов
/ 26 марта 2013

Ни один из предложенных ответов не будет работать. git svn fetch с ревизией будет извлекать только более новые ревизии, чем те, которые уже клонированы. Возможно, вы сможете использовать git svn reset, чтобы вернуться к более старой ревизии и получить оттуда, но потом вам придется сделать некоторую грязную работу, чтобы «привить» ваши новые ревизии обратно на полное дерево (SHA1 SVN). ревизия в git зависит от всего происхождения ревизии). Если вам пригодятся скальпели, которые вам предлагает git, сделайте это.

Гораздо проще просто избежать этой проблемы.

  • Сделайте начальный клон из последних нескольких ревизий, чтобы вы могли немедленно приступить к работе;
  • Запустить еще один клон полной истории в другой каталог / git-репозиторий;
  • Работайте в своей частичной истории столько, сколько хотите;
  • Когда полный клон завершится, используйте подход, подобный http://www.sanityinc.com/articles/relocating-git-svn-repositories/, чтобы скопировать вашу работу из частичного хранилища в полное.

Итак, это частичный ответ - как вы можете потом извлечь историю? Загрузите его в другой репозиторий и скопируйте то, что вам нужно. Это можно сделать кусками по 1000 в обратном порядке? С помощью скальпелей и большого терпения он может , но вряд ли это того стоит. Полная выборка, запущенная вперед, обгонит все эти первые ревизии, захваченные каждым блоком, который вы git svn fetch, и исправление станет утомительным.

0 голосов
/ 11 января 2010

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

Я выбрал самые последние ревизии, а затем начал " заполнять " пробелы. Вроде нормально работает.

Джеспер - если в вашем репозитории нет ревизии 1000, тогда ему нечего получить. Убедитесь, что номера ревизий, которые вы используете, действительны!

...