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 loggit showgit 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を指定し、新しいコミットに従ってタグを上書きする必要があります。 これを行うには、 cattag-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リポジトリを変更/修正するための非常に豊富な機能を提供します。 ここですべての機能について読むことができます

Source: https://habr.com/ru/post/J178069/


All Articles