Viking passe de Subversion à Git

  |   Source

Et oui, c'est fait. Après plusieurs semaines de réflexion, le code source de viking n'est plus historisé avec Subversion, mais avec Git.

Cette migration a été rendu possible suite à l'intégration d'un service Git dans SourceForge.

La conversion a été faite en deux temps. Tout d'abord, l'historique a été importé avec git svn. Puis, cet historique a été remanié à l'aide de git filter-branch. L'objectif de ce remaniement était double : supprimer quelques traces laissées par git svn, mais surtout, réintroduire les auteurs des différents commits. En effet, Git permet de distinguer l'auteur d'un patch (author) de celui qui l'a introduit dans l'historique (committer). La migration était donc l'occasion d'identifier correctement les différents contributeurs, chose importante à mes yeux (il faut rendre à César ce qui est à César).

Le script utilié est le suivant

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#!/bin/bash

if [ $# != 1 -o ! -r "$1" ]  
then  
  echo "Error: need filename as argument" >&2  
  exit 1  
fi

AUTHORS_FILE="$1"  
export AUTHORS_FILE  
cut -d: -f1 $AUTHORS_FILE > /tmp/authors.txt

# Correct main devel  
# Do this before restoring real authors  
git filter-branch --env-filter '  
n=$GIT_AUTHOR_NAME  
m=$GIT_AUTHOR_EMAIL

DATA=$(grep "(${GIT_AUTHOR_NAME})" $AUTHORS_FILE)  
if [ -n "$DATA" ]  
then  
    n=$(expr "$DATA" : ".*:\(.*\)< ")  
    m=$(expr "$DATA" : ".*<\(.*\)>")  
fi

export GIT_AUTHOR_NAME="$n"  
export GIT_AUTHOR_EMAIL="$m"  
export GIT_COMMITTER_NAME="$n"  
export GIT_COMMITTER_EMAIL="$m"  
' --msg-filter '  
sed -e "/^git-svn-id:/d"  
' --commit-filter '  
cat > /tmp/msg.log  
author=`grep -v "Signed" /tmp/msg.log | grep -o -f /tmp/authors.txt`  
if [ -n "$author" ]  
then  
  n=$(expr "$(grep "$author" $AUTHORS_FILE)" : ".*:\(.*\)< ")  
  test -z "$n" && n="$author"  
  m=$(expr "$(grep "$author" $AUTHORS_FILE)" : ".*<\(.*\)>")  
  export GIT_AUTHOR_NAME="$n"  
  export GIT_AUTHOR_EMAIL="$m"  
fi  
git commit-tree "$@" < /tmp/msg.log  
'

Ce script utilise un fichier d'entrée décrivant les différents auteurs. Le format est :

ref_auteur:nom_auteur <email @auteur> (login_svn)
</email></code>
Avec :
<ul>
    <li>ref_auteur : une référence à l'auteur faite dans un des messages de commit</li>
    <li>nom_auteur : le nom de l'auteur (correctement orthographié)</li>
    <li>login_svn : éventuellement, le login Subversion de l'auteur</li>
</ul>

Bref, et voilà, le résultat est <a href="http://viking.git.sourceforge.net/git/gitweb.cgi?p=viking">consultable en ligne</a>.