2009-03-24 4 views
25

Sto usando git-svn per archiviare una versione di "staging" di qualche repository SVN, in cui altri utenti possono prelevare da questo repository di staging e trasferirvi le modifiche, quindi il i commit sul repository di staging vengono periodicamente impegnati nel repository SVN upstream.Mapping tra git committer e utenti SVN

Voglio sapere se c'è un modo per mappare tra i nomi dei git committer e i nomi utente SVN, in modo che le loro informazioni vengano mantenute intatte quando si riprende il repository SVN?

risposta

24

Vincent Danen fa parlare the -A option when using git svn:

Quindi, utilizzando ~/git come una directory di livello superiore per Git repository [...] creare un file authors.txt.
Questo file mapperà i nomi dei committer Subversion agli autori Git, risultando in una cronologia corretta del repository Subversion importato.
Per i progetti con un piccolo numero di committer, questo è abbastanza facile. Per progetti più grandi con molti committer, questo potrebbe richiedere del tempo. La sintassi del file sarebbe:

user = Joe User <[email protected]> 
vdanen = Vincent Danen <[email protected]> 

Il nome breve è il nome committer per Subversion mentre la forma lunga è nome e indirizzo e-mail completo dell'utente, ed usati per Git.

Il passaggio finale consiste nel clonare il repository Subversion, che crea un repository Git locale basato su di esso. Assumendo che il repository utilizza gli standard di/tronco,/tag e/rami, uso:

# git svn clone --no-metadata -A authors.txt -t tags -b branches -T trunk https://svn.example.com/svn/repo 

-A<filename> 
--authors-file=<filename> 

sintassi è compatibile con il file utilizzato da git-cvsimport:

loginname = Joe User <[email protected]> 

Se questa opzione è specificata e git-svn rileva un nome di commit SVN che non esiste negli autori -file, git-svn interromperà l'operazione.
L'utente dovrà quindi aggiungere la voce appropriata.
Il riesecuzione del precedente comando git-svn dopo la modifica del file degli autori deve continuare l'operazione.

config key: svn.authorsfile 

Questo dovrebbe funzionare per tutti git-svn comandi, tra cui git-svn dcommit (quando si preme - SVN) (Nota: non ho ancora testato direttamente però).

Mohammed Gamal segnala (nei commenti) funziona, ma senza l'opzione --no-metadata.

+1

Questo funziona anche nella direzione git-> svn, come richiesto da OP? –

+0

@Christoph: a proposito, * si * ha un mirror SVN di un repository Git (http://stackoverflow.com/questions/570945/git-clone-of-git-svn-tree/571084#571084). Hai mai dovuto usare l'opzione --authors-file? – VonC

+2

La soluzione funziona, ma senza l'opzione --no-metadata –

1

una seconda opzione è fornire un programma/script che risolva la mappatura.

Molto utile se il numero di committer è sconosciuto ma potrebbe essere "generato" dal nome del committer SVN!

Se ... Nome del commit SVN che non esiste nel file authors, git svn interromperà l'operazione. L'utente dovrà quindi aggiungere la voce appropriata. Re-esecuzione del precedente comando git svn dopo gli autori-file viene modificato ...

così, Perciò abbiamo:

--authors-prog=mapMyCompanyUsers.sh 

di non avere la forza tutti gli utenti alla cassa/riccio/wget'ting la mappa-script prima, si potrebbe fornire qualcosa di simile:

$(tmpMapFile="$TMPDIR/mapSvnUsersAutomatically.$$.sh" && echo -e '#!/bin/sh\necho $1" <"$1"@example.com>"' > $tmpMapFile && chmod +x $tmpMapFile && echo $tmpMapFile) 

Il clone sarà simile:

$ git svn clone -s --authors-prog=$(tmpMapFile="$TMPDIR/mapSvnUsersAutomatically.$$.sh" && echo -e '#!/bin/sh\necho $1" <"$1"@example.com>"' > $tmpMapFile && chmod +x $tmpMapFile && echo $tmpMapFile) https://svn.example.com/svn/repo/ 

Ciò importerà che tutti i mapping siano esattamente uguali ei cloni SVN potrebbero essere "condivisi" e uniti tramite git!