web-dev-qa-db-ja.com

Gitリポジトリファイルエンコーディングを変換する

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

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

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

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

これは可能ですか(ハッシュコードと、コミット、ブランチ、タグをウォークスルーする方法がわかりません)。または、このようなものを処理できるツールはありますか?

27

これは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コマンドを拡張して、すべてのコミットを編集する必要がある場合があります。

20
Celada