こんにちは 仕様により、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つのフィルターを使用します。
-   
--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リポジトリを変更/修正するための非常に豊富な機能を提供します。 ここですべての機能について読むことができます 。