ISO-8859-1
にファイルを含む大きなCVSリポジトリがあり、これをgitに変換したいと考えています。
確かに、エンコードにISO-8859-1
を使用するようにgitを構成できますが、utf8
に含めたいです。
iconv
やrecode
などのツールを使用して、作業ツリー内のファイルのエンコーディングを変換できます。 converted encoding
のようなメッセージでこれをコミットできます。
私の質問は今、完全な履歴を変換する可能性はありますか? cvsからgitへの変換時またはその後。私のアイデアは、gitリポジトリの各コミットを読み取るスクリプトを記述し、それをutf8
に変換して、新しいgitリポジトリにコミットすることです。
これは可能ですか(ハッシュコードと、コミット、ブランチ、タグをウォークスルーする方法がわかりません)。または、このようなものを処理できるツールはありますか?
これは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
コマンドを拡張して、すべてのコミットを編集する必要がある場合があります。