Как я могу преобразовать 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?)

Другие вопросы по тегам