
警告
実際、新しいリポジトリが作成されるため、手順の前に、現在の開発を中断し、すべての変更を条件付きの中央リポジトリにマージして、トランスコードする必要があります。 受信したリポジトリを確認した後、すべてのマシンに再クローンする必要があります。
Gitとエンコード
Gitはバイナリデータで動作するため、コミットコメントに関する限り、ファイルのエンコーディングと相互作用せず、それらを渡した形式で保存しますが、コミットごとに
encoding
ヘッダーが書き込まれ、後で使用できますコメントを要求するとき。
encoding
ヘッダー
encoding
空の場合、gitはそれをUTF-8に等しいと見なします。
設定するには、[i18n]セクションに2つのパラメーターがあります。
[i18n] commitencoding = UTF-8 logoutputencoding = KOI8-R
1つ目は、
git commit
および
git commit-tree
コマンドのエンコードヘッダーのコンテンツを設定するだけです。2つ目は、
git log
、
git show
、
git blame
コマンドにコメントテキストのエンコードをユーザーに表示する前にトランスコードする必要があることを伝えます。 パラメーターが指定されていない場合、gitは
logoutputencoding
UTF-8と
logoutputencoding
ますが、最初のパラメーターのみが設定されている場合、gitは2番目のパラメーターの値も使用します。
このため、さまざまなエラーが発生する可能性があります。たとえば、
encoding
ヘッダーがコメントのエンコードと一致しないが
logoutputencoding
パラメーターの値と等しい場合、gitはトランスコードが不要であると判断し、それぞれ同じロケールに設定されたマシンでコメントテキストを表示しますコメントとしてエンコードすると、コンテンツは正しく表示されますが、他のすべてにはゴミがあります。
コメントを
encoding
するヘッダーの値を表示するには、次のコマンドを使用できます。
git log –pretty=”%h - '%e': %s”
git log
コマンドの機能の詳細については、 こちらをご覧ください 。
Gitフィルター分岐
それで、私たちはこの記事のメイントピックに来ます。 既存のリポジトリの「履歴を書き換える」ために、
git filter-branch
コマンドが使用されます。 これにより、以前にさまざまなフィルターでファイルまたはメタデータを処理して行われたすべてのコミットを順次繰り返すことができます。
この記事では3つのフィルターを使用します。
-
--msg-filter
コメントコミットのテキストを上書きするために使用されます。 -
--env-filter
コミットが行われた環境(著者名、メールアドレスなど)を変更する必要がある場合に使用されます。 -
--tag-name-filter
タグのテキストを上書きするために使用されます。
各フィルターの後に、コミットを書き込む前に
git filter-branch
が実行されるコマンドが与えられます。
リポジトリ全体を確認するには、
--all
パラメーターを指定し、フィルターから追加のパラメーターと分離し、ターゲットとして
HEAD
を指定し、新しいコミットに従ってタグを上書きする必要があります。 これを行うには、
cat
で
tag-name
フィルターを追加します。
git filter-branch <> --tag-name-filter 'cat' -- --all HEAD
コメントのエンコーディングを変更する前に、
i18n.commitencoding
ディレクティブの正しい値を設定することを忘れないでください-リポジトリ操作の完了後に受信したすべてのヘッダーに書き込まれます。
コメントのエンコードを変換するには、次のコマンドを使用します。
'iconv -c -s -f KOI8-R -t UTF-8'
- s-サイレントモード。
- c-変換できない文字をスキップします。
git filter-branch
コマンドの形式は次のとおりです。
git filter-branch --msg-filter 'iconv -c -s -f KOI8-R -t UTF-8' \ --tag-name-filter 'cat' -- --all HEAD
「履歴の書き換え」の操作はワークフローをおおまかに妨害するので、エラーの最大数を修正しようとするのは理にかなっています。 これらは、環境パラメータ、そこにあるべきではないリポジトリに保存されているファイル、個々のファイルのエンコードまたはデータの一部などを誤って設定する可能性があります
特に、著者の電子メールがいくつかのコミットに対して誤って設定されていることがわかりました。 その時点ですべてのコミットが作成されたため、すべてのコミットでこのパラメーターを上書きするだけで問題は解決しました。
git filter-branch --msg-filter 'iconv -c -s -f KOI8-R -t UTF-8' \ --env-filter 'export GIT_AUTHOR_EMAIL="xxx@gmail.com" export GIT_COMMITTER_EMAIL="xxx@gmail.com"' \ --tag-name-filter 'cat' -- --all HEAD
しかし、当然のことながら、異なる条件などでより複雑な構造を使用することを誰も気にしません。
一般に、
git filter-branch
コマンドは、gitリポジトリを変更/修正するための非常に豊富な機能を提供します。 ここですべての機能について読むことができます 。