gitリポジトリエンコーディングの変更

こんにちは 仕様により、KOI8-Rを搭載したLinuxが職場で使用され、gitリポジトリへのすべてのコミットはローカルエンコーディングで実行されました。 しばらくして、リポジトリをUTF-8にトランスコードすることになりました。 この記事では、既存のgitリポジトリーのエンコードを変更するテクノロジーと、特定のコミットで発生したエラーの修正について説明します。



警告



実際、新しいリポジトリが作成されるため、手順の前に、現在の開発を中断し、すべての変更を条件付きの中央リポジトリにマージして、トランスコードする必要があります。 受信したリポジトリを確認した後、すべてのマシンに再クローンする必要があります。



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つのフィルターを使用します。



各フィルターの後に、コミットを書き込む前に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'
      
      







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リポジトリを変更/修正するための非常に豊富な機能を提供します。 ここですべての機能について読むことができます



All Articles