2008-12-24 7 views
51

Ich habe ein Repository, das ich habe bereits von SVN geklont. Ich habe einige Arbeiten in diesem Repository in seiner Git-Form gemacht, und ich würde es hassen, diese Struktur durch erneutes Klonen zu verlieren. Als ich jedoch das Repository ursprünglich geklont habe, konnte ich die Eigenschaft svn.authors (oder eine semantisch ähnliche Option) nicht korrekt angeben. Gibt es eine Möglichkeit, die SVN-Autorenzuordnungen jetzt anzugeben, wenn das Repository vollständig konfiguriert ist? Am liebsten würde ich alle alten Commit-Autoren korrigieren, die den Git-Autor und nicht den rohen SVN-Benutzernamen repräsentieren.Rückwirkend richtige Autoren mit Git SVN?

Antwort

55

durch Sehen Beginnen Sie heraus, was Sie aufzuräumen haben zu:

git shortlog -s 

Für jeden dieser Namen, einen Eintrag in einem Skript erstellen, das wie folgt aussieht (Sie alle Autoren und Committer vorausgesetzt wollen gleich zu sein):

#!/bin/sh 

git filter-branch --env-filter ' 

n=$GIT_AUTHOR_NAME 
m=$GIT_AUTHOR_EMAIL 

case ${GIT_AUTHOR_NAME} in 
     user1) n="User One" ; m="[email protected]" ;; 
     "User Two") n="User Two" ; m="[email protected]" ;; 
esac 

export GIT_AUTHOR_NAME="$n" 
export GIT_AUTHOR_EMAIL="$m" 
export GIT_COMMITTER_NAME="$n" 
export GIT_COMMITTER_EMAIL="$m" 
' 

das ist im Grunde das Skript, das ich für ein large rewrite vor kurzem verwendet, die sehr viel war, wie Sie beschrieben (außer ich eine große Anzahl von Autoren hatte).

bearbeiten Verwenden Sie π wies ein Zitat Problem in meinem Skript. Vielen Dank!

+1

Sollte exportieren GIT_AUTHOR_NAME = "$ n" oder nur der Vorname des Autors wird im Index landen! –

+4

Dieses Skript funktioniert einwandfrei. Aber nachdem ich es angewendet habe, verursacht ein Aufruf von "git svn rebase" die Fehlermeldung: "Es konnte keine Upstream-SVN-Information aus dem Arbeitsbaumverlauf ermittelt werden". – olenz

+0

Wie gehen Sie dann und schieben Sie die redigierten/korrigierten Autoren zurück zur Fernbedienung? – user1027169

2

Sie wahrscheinlich in git-filter-branch, speziell die --commit-filter Option suchen. Dieser Befehl ist eine leistungsstarke Kettensäge, mit der Sie den gesamten Repository-Verlauf neu schreiben und Änderungen vornehmen können, die Sie ändern möchten.

Beachten Sie, dass wenn Sie dies tun, sollten Sie neue Klone aus dem aktualisierten Repository ziehen, da die SHA1-Hashes jedes Commits geändert haben möglicherweise.

10

git filter-branch kann verwendet werden, um große Teile der Geschichte neu zu schreiben.

In diesem Fall würden Sie wahrscheinlich so etwas wie (total ungetestet) tun:

git filter-branch --env-filter ' 
    GIT_AUTHOR_NAME=`echo "${GIT_AUTHOR_NAME}" | sed -e "s/svnname1/Right Name/; s/svnname2/Correct Name/"` 
    GIT_COMMITTER_NAME=`echo "${GIT_COMMITTER_NAME}" | sed -e "s/svnname1/Right Name/; s/svnname2/Correct Name/"` 
    GIT_AUTHOR_EMAIL=`echo "${GIT_AUTHOR_EMAIL}" | sed -e "s/svnname1/[email protected]/; s/svnname2/[email protected]/"` 
    GIT_COMMITTER_EMAIL=`echo "${GIT_COMMITTER_EMAIL}" | sed -e "s/svnname1/[email protected]/; s/svnname2/[email protected]/"` 
' 

Wie immer gilt folgendes: um die Geschichte neu zu schreiben, müssen Sie eine conspiracy.

+0

Upvoted für: "Wie immer gilt Folgendes: Um Geschichte zu schreiben, brauchen Sie eine Verschwörung." Sehr gut gesagt. (Obwohl der Link nicht mehr geladen wird) –

+0

Danke! Ich habe die Links repariert. –

+0

Sie würden auf Probleme mit den gegebenen Regexes stoßen, wenn Sie einen Svn-Namen haben, der eine Teilmenge eines anderen Svn-Namens ist ... Deshalb gab Gott uns '^' und '$'. – Dan