WindowsでGit Shellを使用してdiffパッチを作成する場合( GitHub for Windows を使用する場合)、パッチの文字エンコーディングは、Notepad ++に従ってUCS-2リトルエンディアンになります(下のスクリーンショットを参照) )。
この動作を変更し、gitにBOM文字エンコードなしでANSIまたはUTF-8のパッチを作成させるにはどうすればよいですか?
UCS-2リトルエンディアンでエンコードされたパッチを適用できないため、問題が発生します。手動でANSIに変換する必要があります。そうしないと、 "fatal:unrecognized input"エラーが発生します。
その後、EOLをWindows形式から手動で変換する必要があることにも気付きました(\r\n
)からUNIX(\n
)をNotepad ++で(編集> EOL変換> UNIX)。これを行わないと、「末尾の空白」エラーが発生します(すべての空白が削除されている場合でも、 "TextFX"> "TextFX Edit"> "Trim Trailing Spaces")。
したがって、パッチを適用するために必要な手順:
このスクリーンショットを見てください:
私は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
で指定できます。
Powershellを使用する場合は、次のようにすることもできます。
cmd /c "git diff > patch.diff"
これにより、出力ファイルにそのまま書き込むCMDを介してコマンドが実行されます。
Powershellで生成されたdiffでdos2unixを実行すると、私にとってはうまくいくようです。その後、diffを正常にapply
することができました。
dos2unix.exe diff_file
git apply diff_file
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 !]