2012-06-15 5 views
22

Ich habe ein großes CVS-Repository mit Dateien in ISO-8859-1 und möchte dies in git konvertieren.Konvertieren Git Repository-Datei Codierung

Sicher kann ich Git zur Verwendung ISO-8859-1 für die Codierung konfigurieren, aber ich möchte es in utf8 haben.

Jetzt mit Tools wie iconv oder recode kann ich die Codierung für die Dateien in meinem Arbeitsbaum konvertieren. Ich könnte dies mit einer Nachricht wie converted encoding begehen.

Meine Frage ist jetzt, gibt es eine Möglichkeit, die komplette Geschichte zu konvertieren? Entweder bei der Konvertierung von cvs in git oder danach. Meine Idee wäre, ein Skript zu schreiben, das jedes Commit im Git-Repository liest und in utf8 konvertiert und in ein neues Git-Repository schreibt.

Ist das möglich (ich bin unsicher über die Hash-Codes und wie man durch die Commits, Zweige und Tags geht). Oder gibt es ein Werkzeug, das so etwas handhaben kann?

+3

Ja, Sie können den Verlauf neu schreiben, aber wahrscheinlich sollten Sie nicht: Sie sollten nie ein Repository neu schreiben, das Sie bereits irgendwo geschoben haben. Meine Meinung ist: 'iconv' und ein normales Commit ist der richtige Weg. – KingCrunch

+1

Okay, danke @KingCrunch. Aber seit ich das Git-Repository neu erstellt habe, wird es ins Nirgendwo verschoben. Und ich würde auch akzeptieren, ein zweites Repository mit der "utf8" -Encodierung basierend auf der Geschichte des ersten zu erstellen. Das ist im Grunde das Gleiche, statt dass ich das bestehende Repo nicht modifizieren würde. –

Antwort

17

Sie können dies mit git filter-branch tun. Die Idee ist, dass Sie die Kodierung der Dateien bei jedem Commit ändern müssen, indem Sie jedes Commit neu schreiben.

Schreiben Sie zuerst ein Skript, das die Codierung jeder Datei im Repository ändert. Es könnte wie folgt aussehen:

#!/bin/sh 

find . -type f -print | while read f; do 
     mv -i "$f" "$f.recode.$$" 
     iconv -f iso-8859-1 -t utf-8 < "$f.recode.$$" > "$f" 
     rm -f "$f.recode.$$" 
done 

Dann git filter-branch verwenden dieses Skript immer und immer wieder laufen, einmal pro begehen:

git filter-branch --tree-filter /tmp/recode-all-files HEAD 

wo /tmp/recode-all-files das obige Skript.

Gleich nachdem das Repository frisch von CVS aktualisiert wurde, haben Sie wahrscheinlich nur einen Zweig in git mit einem linearen Verlauf zurück zum Anfang. Wenn Sie über mehrere Zweige verfügen, müssen Sie möglicherweise den Befehl git filter-branch zum Bearbeiten aller Commits erweitern.

+0

Großartig! Derzeit läuft der Befehl auf einem Test-Git-Repository. In der Tat habe ich viele Zweige, ich habe nur die Dokumentation überprüft, muss ich nur ''all' 'anhängen, um alle Zweige zu filtern? –

+0

Für alle anderen filtert "git filter-branch --tree-filter/tmp/recode-all-files --all" alle Zweige. –

+1

Ich versuche, Ihre Antwort zu verwenden, aber ich bekomme einen recode-all-files: Befehl nicht gefunden. Ich benutze einen Mac, es scheint, iconv installiert zu haben, ich weiß nicht, ob ich zusätzliche Einstellung auf das setzen muss – marimaf