Как я могу преобразовать SVN репо в Git с помощью reposurgeon?
Можете ли вы привести пример, как я добавляю путь к моему старому svn и создаю из него папку git, которая содержит всю историю и все ветви / теги?
Я нашел этот сайт стоит попробовать? Оно использует svnpull
, который не в моей системе, я могу использовать repopuller
вместо?
Я установил reposurgeon с
apt-get install --no-install-recommends xmlto asciidoc unp
wget http://www.catb.org/~esr/reposurgeon/reposurgeon-3.7.tar.gz
unp reposurgeon-3.7.tar.gz
cd reposurgeon-3.7
make
make install
(Я бы установил без рекомендаций, потому что здесь не нужно около 700 МБ)
1 ответ
Кажется, сайт немного устарел.
svnpull теперь заменен repopuller. И вам это не нужно, если вы находитесь на одном сервере.
Я адаптировал скрипт:
nano /usr/local/sbin/reposurgeon-convert-svn2git
и вошел:
#!/bin/bash
PROJECT=myproject
svnrepo=svn+ssh://rubo77@myserver.de/var/svn-repos/$PROJECT
# or something like svnrepo=https://svn.origo.ethz.ch/$PROJECT
gitrepo=/tmp/$PROJECT-git
cd /tmp
# start over with:
#rm $PROJECT-mirror/ $PROJECT-git/ -Rf
echo
echo pull/copy the repository...
#repopuller $svnrepo
# or copy it if it is on the same server:
cp -av /var/svn-repos/$PROJECT /tmp/$PROJECT-mirror
echo
echo start conversion...
reposurgeon <<EOF
read /tmp/$PROJECT-mirror
prefer git
edit
references lift
rebuild $gitrepo
EOF
echo ...finished
# now filter out all falsly generated .gitignore files:
cd $gitrepo/
git filter-branch --force --index-filter \
"git rm --cached --ignore-unmatch $(find . -name .gitignore|xargs )" \
--prune-empty --tag-name-filter cat -- --all
Я отфильтровываю файлы.gitignore, которые github задокументировал с помощью filter-branch, потому что в противном случае они будут создавать коммиты во всех тегах (см. Примечание ниже). Вы должны создать новый файл.gitignore, когда вы закончите.
Это может занять некоторое время, поэтому вы должны начать его внутри tmux
или же screen
с
tmux
bash /usr/local/sbin/reposurgeon-convert-svn2git
Позаботьтесь о том, чтобы все ваши теги соответствовали.
Я получил ошибку
reposurgeon% reposurgeon: exporting...fatal: Branch name doesn't conform to GIT standards: refs/tags/version 3.6.2
Поэтому я очистил хранилище svn и удалил эту ветку, чтобы все теги и ветви соответствовали:
svn rm "$svnrepo/tags/version 3.6.2"
и удалил его из всей истории с помощью этого сценария: Как полностью удалить тег SVN, содержащий пробелы?
Затем я начал заново со сценарием:
rm $PROJECT-mirror/ $PROJECT-git/ -Rf
bash /usr/local/sbin/reposurgeon-convert-svn2git
Замечания:
Не удаляя .gitignore
Для файлов, в git все выглядит так же, как и в SVN, за исключением одной вещи: все теги упорядочиваются в журнале в точную дату, когда они были помечены, вместо фиксации, в которой они начали рекламу. Кажется .gitignore
файл добавляется туда в процессе преобразования к каждой ветви и тегу, но этот файл.gitignore приводит к фиксации внутри этих тегов с отметкой времени создания тега.
Новые теги в порядке, они появляются прямо в ревизии, к которой они принадлежат. (см. Преобразование репозитория SVN в git с reposurgeon без создания файлов.gitignore?)