Если нельзя, но очень хочется, то нужно обязательно и ничего в мире не стоит того, чтобы делать из этого проблему!


Интересна Java? Кликай по ссылке и регистрируйся!
Если тебе полезно что-то из того, чем я делюсь в своем блоге - можешь поделиться своими деньгами со мной.
с пожеланием
столько времени читатели провели на блоге - 
сейчас онлайн - 

среда, 24 апреля 2013 г.

Как выкачать репозиторий с историей из GoogleCode, отфильтровав его по проекту

Помогли мне в этом несколько статеек.


Спасибо Авторам за то время, которое они затратили на поиск решения и публикацию в блоге. Так же и гуглу спасибо. Я тоже немного времени инвестирую на написание этого поста заметки.

Что мне надо было сделать? Надо было выкачать из GoogleCode svn репозиторий с историей. Раньше я уже решал это, но как оно часто бывает, что-то поломалось и это решение больше не подходит. Пришлось искать другое. И оно нашлось.

Итак еще раз. Есть GoogleCode репозиторий. Я хочу получить его на локали, чтобы потом отфильтровать некоторые ревизии и потом всю историю смерджить в основной git репозиторий.

Поехали. Проект находится в https://kpi-java-training.googlecode.com/svn/trunk/BattleCity, причем корень репозитория https://kpi-java-training.googlecode.com/svn.

Нам понадобится Subversion 1.7.9 (у меня Windows 64-bit) от CollebNet.
// Создаем пустой репозиторий находясь в E:\JavaForFun\
svnadmin create all

// создаем файл в E:\JavaForFun\all\hooks\ с именем pre-revprop-change.bat и содержимым exit /b 0
cd all
cd hooks
echo exit /b 0 > pre-revprop-change.bat

// возвращемся назад
cd ..
cd ..

// синхронизируем репозиторий
svnsync init file:///E:/JavaForFun/all https://kpi-java-training.googlecode.com/svn/
svnsync sync file:///E:/JavaForFun/all 

// далее наблюдаем, как ревизия за ревизией все сливается к нам на локаль
// ...
// Copied properties for revision 753.
// Transmitting file data ...
// Committed revision 754.
// Copied properties for revision 754.
// Transmitting file data ....
// Committed revision 755.
// Copied properties for revision 755.
// Transmitting file data ...
// Committed revision 756.
// ...

// После можно сделать дамп (обрати внимание, тут путь обычный, а не file://)
svnadmin dump E:/JavaForFun/all> all.dump

// видим, как дампятся ревизии..
// ...
// * Dumped revision 726.
// * Dumped revision 727.
// * Dumped revision 728.
// * Dumped revision 729.
// * Dumped revision 730.
// ...

// фильтруем из бекапа all.dump в battlecity.dump только ревизии проекта находящегося в /trunk/BattleCity
svndumpfilter include /trunk/BattleCity < all.dump > battlecity.dump
Так случилось, что из бекапа svnadmin не хотел поднимать репозиторий. Говорил, что нет папки trunk, потому мне пришлось открыть его в текстовом файле и в конец описания ревизии 1
Revision-number: 1
Prop-content-length: 112
Content-length: 112

K 7
svn:log
V 38
This is an empty revision for padding.
K 8
svn:date
V 27
2012-02-15T12:21:42.764614Z
PROPS-END
Добавить это
Node-path: trunk
Node-kind: dir
Node-action: add
Prop-content-length: 10
Content-length: 10

PROPS-END
Кстати, в процессе фильтрации создается множество ревизий с описанием "This is an empty revision for padding." не содержащих ничего.
Revision-number: 5
Prop-content-length: 112
Content-length: 112

K 8
svn:date
V 27
2012-02-16T18:37:15.998497Z
K 7
svn:log
V 38
This is an empty revision for padding.
PROPS-END
Их можно в dump файле удалять, только при одном условии, что все порядковые номера, последующих после удаленного блока ревизий будут продолжать ряд - "без единого разрыва" :).

Возможны ошибки в процессе поднятия зачищенного бекапа, сообщающие, что такой-то ревизии N нет. Нужно найти ссылку на нее в дампе и изменить на новый номер.
Revision-number: 761
Prop-content-length: 323
Content-length: 323
...
PROPS-END

Node-kind: dir
Node-copyfrom-rev: 760 (Вот оно! - мне пришлось изменить это число на 50 потому как я удалил 710 пустых ревизий)
Node-copyfrom-path: trunk/BattleCity/test
Node-path: trunk/BattleCity/com.javatrainee.tanks.test
Node-action: add
Content-length: 0
Немного рутины, но это мне позволило избавиться от 600 пустых ревизий (тогда как мне нужно всего 53).

После я смог продолжить...
// поднимаем репозиторий из бекапа
svnadmin create battlecity
svnadmin load --ignore-uuid E:\JavaForFun\battlecity < battlecity.dump

// наблюдаем 
// ...
// ------- Committed revision 55 >>>
// <<< Started new transaction, based on original revision 56
// ------- Committed revision 56 >>>
// <<< Started new transaction, based on original revision 57
// ------- Committed revision 57 >>>
// <<< Started new transaction, based on original revision 58
// ------- Committed revision 58 >>>
// ...
После этого я имел на руках репозиторий, с которым мог уже работать с git

9 комментариев:

  1. Саша привет. Я не понимаю, зачем ты делал фильтрацию средствами SVN? git svn же делает все за тебя, причем у тебя уже есть в блоге описание этого процесса.

    $git svn clone https://kpi-java-training.googlecode.com/svn/trunk/BattleCity --no-metadata

    Все. Результат будет абсолютно тот же.

    Для того, чтобы убрать пустые коммиты:

    $ git filter-branch --tag-name-filter cat --prune-empty -- --all

    ОтветитьУдалить
    Ответы
    1. Я потратил на импорт 2 минуты. Одну из них на поиск правильной команды для удаления пустых коммитов.

      Удалить
    2. Саша, это так круто что ты есть :)
      Я прямо сейчас же попробую эту возможность.
      Спасибо!

      Удалить
    3. Пока я наткнулся на
      69445314 [main] perl.exe" 20736 fork_copy: loaded dll data/bss pass 0 failed, 0x
      671A4000..0x671A4014, done 0, windows pid 16692, Win32 error 487
      в процессе.
      $git svn clone https://kpi-java-training.googlecode.com/svn/trunk/BattleCity --no-metadata
      Надо гуглить... Отложу на потом.

      Удалить
    4. Странно - пробовал на 2х компьютерах - нет такой проблемы(

      Удалить
    5. У меня Win8, может из за этого?

      Удалить
  2. Ты же без $ вводишь? просто

    git svn clone https://kpi-java-training.googlecode.com/svn/trunk/BattleCity --no-metadata

    ?

    ОтветитьУдалить