42

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

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

UCS-2リトルエンディアンでエンコードされたパッチを適用できないため、問題が発生します。手動でANSIに変換する必要があります。そうしないと、「致命的:入力が認識されません」というエラーが発生します。

gitパッチの作成

文字エンコードのNotepad++スクリーンショット


それ以来、Notepad ++でEOLをWindows形式( \r\n)からUNIX( )に手動で変換する必要があることにも気づきました([編集]>[EOL変換]>[UNIX])。\nこれを行わないと、「末尾の空白」エラーが発生します(すべての空白がトリミングされている場合でも:「TextFX」>「TextFXEdit」>「TrimTrailingSpaces」)。

したがって、パッチを適用するために必要な手順は次のとおりです。

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

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

Gitを使用してWindowsPowershellにパッチを適用すると問題が発生します

4

6 に答える 6

20

私はWindowsユーザーではないので、一粒の塩で答えてください。Windows PowerShellクックブックによると、PowerShellはの出力を前処理しgit diff、行に分割します。Cmdletのドキュメントは、パラメータなしの場合と同じOut-Fileであることを示唆しています。このコメントは、PowerShellのドキュメントにもあります。>| Out-File

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

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

[...]

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

行の折り返しを画面の幅に一致させない出力を取得するには、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 diffformat-patch(stdoutではなく)ファイルに直接書き込むため、その出力は再コード化されません。ただし、パッチはコミットからのみ作成でき、任意の差分は作成できません。

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

于 2012-12-06T20:05:21.243 に答える
14

PowerShellを使用する場合は、次のこともできます。

cmd /c "git diff > patch.diff"

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

于 2017-07-06T07:25:08.327 に答える
5

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

ここに画像の説明を入力してください

于 2016-08-05T20:22:03.477 に答える
1
  1. 差分のiconv出力
  2. プレーン7ビットパッチ(純粋な英語)の場合、クレイジーなNotepad++検出を無視できます。patch -contentにはcharset-definitionが含まれていません
于 2012-12-02T04:00:01.313 に答える
1

PowerShellで生成されたdiffでdos2unixを実行すると、うまくいくようです。applyその後、差分をとることができました。

dos2unix.exe diff_file
git apply diff_file
于 2017-07-18T23:56:59.997 に答える
0

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 !]
于 2018-05-08T13:26:40.483 に答える