web-dev-qa-db-ja.com

WindowsのGitシェル:パッチのデフォルトの文字エンコードはUCS-2リトルエンディアンです-これをBOMなしのANSIまたはUTF-8に変更する方法は?

WindowsでGit Shellを使用してdiffパッチを作成する場合GitHub for Windows を使用する場合)、パッチの文字エンコーディングは、Notepad ++に従ってUCS-2リトルエンディアンになります(下のスクリーンショットを参照) )。

この動作を変更し、gitにBOM文字エンコードなしでANSIまたはUTF-8のパッチを作成させるにはどうすればよいですか?

UCS-2リトルエンディアンでエンコードされたパッチを適用できないため、問題が発生します。手動でANSIに変換する必要があります。そうしないと、 "fatal:unrecognized input"エラーが発生します。

Creating git patch

Notepad++ screenshot of the character encoding


その後、EOLをWindows形式から手動で変換する必要があることにも気付きました(\r\n)からUNIX(\n)をNotepad ++で(編集> EOL変換> UNIX)。これを行わないと、「末尾の空白」エラーが発生します(すべての空白が削除されている場合でも、 "TextFX"> "TextFX Edit"> "Trim Trailing Spaces")。

したがって、パッチを適用するために必要な手順:

  1. パッチを作成( これが結果です
  2. 文字エンコードをANSIに変換
  3. NIX形式へのEOL変換
  4. パッチを適用

このスクリーンショットを見てください:

Applying a patch in Windows Powershell with Git is problematic

38
Sk8erPeter

私はWindowsユーザーではないので、私の答えを細かく見てください。 Windows PowerShell Cookbook によると、PowerShellはgit diffの出力を前処理し、行に分割します。 Out-File のドキュメントでは、コマンドレットは、>| Out-Fileと同じであり、パラメータがないことを示唆しています。また、このコメントは PowerShellのドキュメント でも見つかります。

従来の出力リダイレクトに慣れている場合、Out-Fileコマンドレットを使用した結果は、期待したものとは異なる場合があります。その動作を理解するには、Out-Fileコマンドレットが動作するコンテキストに注意する必要があります。

既定では、Out-FileコマンドレットはUnicodeファイルを作成します。これは長期的には最適なデフォルトですが、ASCIIファイルを想定しているツールは、デフォルトの出力形式では正しく機能しません。 Encodingパラメータを使用して、デフォルトの出力形式をASCIIに変更できます。

[...]

Out-fileは、ファイルの内容をコンソール出力のようにフォーマットします。これにより、ほとんどの状況でコンソールウィンドウと同じように出力が切り捨てられます。 [...]

行の折り返しが画面の幅と一致しない出力を取得するには、Widthパラメーターを使用して行の幅を指定できます。

したがって、明らかに文字エンコーディングを選択するのはGitではなく、Out-Fileです。これは、a)PowerShellリダイレクションは実際にはテキストにのみ使用する必要があること、およびb)

| Out-File -encoding ASCII -Width 2147483647 my.patch

エンコードの問題を回避します。ただし、これでもWindowsとUnixの行末の問題は解決されません。行末の変換を行うコマンドレット( PowerShell Community Extensions を参照)があります。

ただし、このすべての再コーディングによって、パッチへの自信が高まるわけではありません(パッチ自体にはエンコーディングがありませんが、単なるバイト文字列です)。前述の クックブック には、スクリプトのInvoke-BinaryProcessが含まれており、コマンドの出力を変更せずにリダイレクトできます。

この問題全体を回避するには、git format-patchの代わりにgit diffを使用する方法もあります。 format-patchは(stdoutではなく)ファイルに直接書き込むため、その出力は再コード化されません。ただし、任意の差分ではなく、コミットからのみパッチを作成できます。

format-patchは、コミット範囲(たとえばmaster^10..master^5)または単一のコミット(たとえばX、X..HEADを意味する)を取り、NNNN-SUBJECT.patchという形式のパッチファイルを作成します。NNNNは増加します4 -桁数と件名は、パッチの(マングルされた)件名です。出力ディレクトリは-oで指定できます。

20
Lars Noschinski

Powershellを使用する場合は、次のようにすることもできます。

cmd /c "git diff > patch.diff"

これにより、出力ファイルにそのまま書き込むCMDを介してコマンドが実行されます。

8
ddiukariev

これが誰かを助ける場合、PowerShellの代わりに古き良きコマンドプロンプトを使用しても問題なく機能します。文字エンコーディングとEOLに関してPowerShellに存在する問題の影響を受けていないようです。

enter image description here

3
Daniel Liuzzi
  1. 差分のIconv出力
  2. プレーンな7ビットパッチ(純粋な英語)の場合は、クレイジーなNotepad ++の検出を無視できます。patch-content does not contain any charset-definition
1
Lazy Badger

Powershellで生成されたdiffでdos2unixを実行すると、私にとってはうまくいくようです。その後、diffを正常にapplyすることができました。

dos2unix.exe diff_file
git apply diff_file
1
Vish

Lars Noschinskiが述べたように、Out-Fileの出力を修正する必要があります。次のコマンドを使用して、Out-FileのDefaultParameterを設定できます。

$PSDefaultParameterValues['Out-File:Encoding'] = 'ASCII'
$PSDefaultParameterValues['Out-File:Width'] = '2147483647'

デフォルトパラメータを設定した後、>を使用してパッチファイルをエクスポートできます。

これらの2行をプロファイルファイルに追加すると、すべて期待どおりに機能します。

λ git stash show -p > test3
C:\Users\..\Source\.. [master +1 ~0 -0 !]
λ git apply test3
C:\Users\..\Source\.. [master +1 ~2 -0 !]
0
Console