2012-06-15 18 views
22

Mam duże repozytorium CVS zawierające pliki w ISO-8859-1 i chcę przekonwertować to na git.Konwersja kodu pliku repozytorium git

Oczywiście mogę skonfigurować git do użycia ISO-8859-1 do kodowania, ale chciałbym mieć go w utf8.

Teraz z narzędziami takimi jak iconv lub recode mogę konwertować kodowanie plików w moim drzewie roboczym. Mogę to zrobić z komunikatem takim jak converted encoding.

Moje pytanie brzmi, czy istnieje możliwość zamiany całej historii? Albo podczas konwersji z cvs do git lub później. Moim pomysłem byłoby napisanie skryptu, który odczyta każde zatwierdzenie w repozytorium git i skonwertuje je na utf8 i zatwierdził je w nowym repozytorium git.

Czy to możliwe (nie jestem pewien co do kodów skrótów i jak przejść przez zatwierdzenia, gałęzie i znaczniki). Czy istnieje narzędzie, które poradzi sobie z czymś takim?

+3

Tak, możesz przepisać historię, ale prawdopodobnie nie powinieneś: Nigdy nie powinieneś przepisywać repozytorium, które już gdzieś zepchnąłeś. Moja opinia brzmi: 'iconv' i normalne zatwierdzenie jest drogą do zrobienia. – KingCrunch

+1

OK, dziękuję @KingCrunch. Ale odkąd niedawno utworzyłem repozytorium git, zostaje ono zepchnięte donikąd. A także zaakceptowałbym stworzenie drugiego repozytorium z kodowaniem "utf8" w oparciu o historię pierwszego. Co jest w zasadzie takie samo zamiast tego, że nie zmodyfikowałbym istniejącego repo. –

Odpowiedz

17

Możesz to zrobić pod numerem git filter-branch. Chodzi o to, że musisz zmienić kodowanie plików w każdym zatwierdzeniu, przepisując każde zatwierdzenie w trakcie pracy.

Najpierw napisz skrypt, który zmienia kodowanie każdego pliku w repozytorium. To może wyglądać następująco:

#!/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 

Następnie użyj git filter-branch aby ponownie uruchomić ten skrypt w kółko, raz popełnić:

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

gdzie /tmp/recode-all-files jest Powyższy skrypt.

Zaraz po tym, jak repozytorium zostało świeżo uaktualnione z CVS, prawdopodobnie masz tylko jedną gałąź w git z liniową historią z powrotem na początek. Jeśli masz kilka oddziałów, może być konieczne poprawienie polecenia git filter-branch w celu edycji wszystkich zatwierdzeń.

+0

Świetnie! Aktualnie polecenie działa w repozytorium git testowym. Rzeczywiście mam wiele gałęzi, właśnie sprawdziłem dokumentację, czy muszę tylko dodać '' --all'', aby odfiltrować wszystkie gałęzie? –

+0

Dla wszystkich innych, '' git filter-branch --tree-filter/tmp/recode-all-files - --all'' filtruje wszystkie gałęzie. –

+1

Próbuję użyć twojej odpowiedzi, ale dostaję polecenie recode-all-files: nie znaleziono polecenia. Używam mac, wygląda na to, że ma zainstalowany iconv, nie wiem, czy muszę ustawić dodatkowe ustawienie na tym – marimaf