29

ファイルを含む大きな CVS リポジトリがISO-8859-1あり、これを git に変換したいと考えています。

ISO-8859-1確かに、エンコードに使用するように git を構成できますが、 utf8.

iconvまたはなどのツールをrecode使用して、作業ツリー内のファイルのエンコーディングを変換できます。のようなメッセージでこれをコミットできますconverted encoding

私の質問は、完全な履歴を変換する可能性はありますか? cvs から git への変換時、またはその後のいずれか。私の考えは、git リポジトリの各コミットを読み取り、それをutf8新しい git リポジトリに変換してコミットするスクリプトを作成することです。

これは可能ですか (ハッシュコードと、コミット、ブランチ、およびタグをたどる方法についてはわかりません)。または、このようなことを処理できるツールはありますか?

4

1 に答える 1

23

これは。で行うことができますgit filter-branch。アイデアは、すべてのコミットでファイルのエンコーディングを変更し、各コミットを書き直す必要があるということです。

まず、リポジトリ内のすべてのファイルのエンコーディングを変更するスクリプトを記述します。次のようになります。

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

次に、を使用git filter-branchして、コミットごとに1回、このスクリプトを繰り返し実行します。

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

/tmp/recode-all-files上記のスクリプトはどこにありますか。

リポジトリがCVSから新たにアップグレードされた直後は、おそらくgitにブランチが1つだけあり、最初に戻った線形の履歴があります。複数のブランチがある場合は、git filter-branchすべてのコミットを編集するためにコマンドを拡張する必要がある場合があります。

于 2012-06-15T15:32:31.730 に答える