git:パッチは適用されません


289

my_pcc_branch.patchというパッチがあります。

適用しようとすると、次のメッセージが表示されます。

$ git apply --check my_pcc_branch.patch
warning: src/main/java/.../AbstractedPanel.java has type 100644, expected 100755
error: patch failed: src/main/java/.../AbstractedPanel.java:13
error: src/main/java/.../AbstractedPanel.java: patch does not apply

どういう意味ですか?

この問題を解決するにはどうすればよいですか?


周りにAbstractedPanel.java.rejファイルがありますか?典型的には、これはラインボットがソースとパッチで変更されたことを意味します(ここではライン13が影響を受けているようです)。
ルディ

いいえ、*。rej​​ファイルは見つかりませんでした。
ドミトリピサレンコ2011年

受け入れられた答えがそれを修正する理由はわからない(だから私はそれが赤いニシンであるのではないhas type 100644, expected 100755かと疑っている)が、どこかにchmod権限の不一致があるという意味ではないのか?
ルフィン

回答:


325

git apply --reject --whitespace=fix mychanges.patch 私のために働いた。

説明

この--rejectオプションは、パッチの適用方法を決定できない場合でも失敗しないようにgitに指示しますが、代わりに個別のハンクを適用し、.rej適用できないハンクに対して拒否ファイル()を作成できます。Wiggleは「拒否されたパッチを適用し、単語ごとの差分を実行」できます。

さらに、--whitespace=fix空白のエラーについて警告し、それ以外の場合は適用可能なハンクの適用を拒否するのではなく、それらを修正しようとします。

両方のオプションを一緒に使用すると、障害に対するパッチの適用がより強力になりますが、結果に関して追加の注意が必要です。

ドキュメント全体については、https://git-scm.com/docs/git-applyを参照してください


8
ファイルを完全に変更しなかったので、これは実際には私にとってはより効果的でした
Wayne Werner

10
これは素晴らしい。それ自体では解決できないものを拒否し、拒否されたファイルを手動で変更できます。
デニス

1
patch -p1 <mychanges.patch#変更をチャンクごとに適用します。変更が失敗した場合、<sourcefile> .origおよび<sourcefile> .rejパッチが作成され、手動で変更を適用できます。私はgit apply --rejectも同じように機能し、--whitespace = fixのほうが魔法のように優れていると思います。
gaoithe 2014

7
このコマンドは.rej、パッチの適用方法を自動的に検出できない場合にファイルを作成します。ウィグルを使用して、このような問題を解決できます。
goodniceweb

14
この回答は何も説明していません。特に、どのような場合に機能するかについては説明していません。人々、あなたは本当に答えの質をもっと要求する必要があります、これはとてもフォーラムではありません。
オリバー

319

msysgit@googlegroups.comメーリングリストのJohannes Sixtは、次のコマンドライン引数を使用することを提案しています:

git apply --ignore-space-change --ignore-whitespace mychanges.patch

これは私の問題を解決しました。


25
誰かが私を助けて、なぜこれが機能するのか説明できますか?もう1つの回答はうまくいきませんでした。質問者が説明するのとまったく同じ問題がありました。空白を無視することでファイル属性は何と関係がありますか?
skrebbel

1
Windows PowerShellの使用git diffで作成されたパッチは、次のように正常に適用されました。git diff HEAD..613fee-myfile.xml | ファイルが作業をしなかったので最初は同じ問題にケースの誰もが実行中で、diffの出力を保存するのに対しgitのは、--ignore-スペース変更--ignore-空白を適用する
TJB

2
また-C1、適用の切り替えを試みます。これにより、重要と見なされる追加の前後のコンテキストが削減されます。
Amir Ali Akbari

2
@ EricWalker、CR / LFによるgitマジックは必ずしも悪いことではありません。代替案は、変更セットの半分が、変更されたすべてのファイルのすべての1行で構成され、ある行から別の行に変更され、実際の変更が途中のどこかに埋め込まれている場合です。
jwg 2013年

3
これは時々役立ちます。しかし、問題なくパッチを適用できるはずの場合でも、「パッチが適用されない」というメッセージが表示されることもあります。
Thomas Levesque

118

他のすべてが失敗した場合、試すgit apply--3wayオプションを

git apply --3way patchFile.patch

--3way
パッチが適切に適用されない場合、パッチが適用されるはずのblobのIDをパッチが記録し、ローカルで使用可能なblobがある場合は、3ウェイマージにフォールバックします。ユーザーが解決する作業ツリー このオプションは--indexオプションを意味し、-rejectおよび--cachedオプションと互換性がありません。

典型的な失敗のケースでは、可能な限り多くのパッチを適用し、通常はそうしますが、gitで動作するように競合を残します。おそらく、reject代替手段よりも1ステップ簡単です。


2
これは私のために働いた答えです。私はパッチ適用したファイル(私はパッチを作成した後、私は変更を削除したため。)私はからパッチを生成した変更を反映していなかった
Christia

3
素晴らしい一般的な解決策。3way diffは通常のようには見えなかったので少し混乱しましたが、それでも、これにより競合を解決してパッチを適用する機能が得られました。
steinybot 2018

8
これ--3wayはデフォルトの動作であると思います。パッチ適用が失敗した場合、少なくとも何が失敗したかを教えて、手動で修正できるようにします。git apply失敗しただけで、なぜ失敗したかを報告しません。私が生成する*.rejようなファイルを見つけることさえできませんでしたhg
Pavan Manjunath

4
間違いなく、最高のソリューション。ユーザーに自分の衝突を解決させましょう!
Mosh Feu、

56

このコマンドは、パッチを適用してパッチを解決せず、不良ファイルを*.rej次のように残します。

git apply --reject --whitespace=fix mypath.patch

あなたはそれらを解決する必要があります。解決された実行:

git -am resolved

7
解決方法*.rej-ソースファイルを手動で変更し、これらの.rejファイルを削除するだけです。その他の方法で ?
coding_idiot

1
@coding_idiotいつものように、.rejファイルを確認して、競合するファイルと比較し、最後に修正したファイルをインデックスに追加します( "git add FIXED_FILES"を使用)
Ivan Voroshilin

2
@coding_idiot ウィグルを使用して解決できます。例:wiggle --replace path/to/file path/to/file.rej。このコマンドは、.rejファイルから元のファイルへの変更を適用します。また、のような元のファイルのコピーを作成しますpath/to/file.porig。ウィグルに関する詳細情報を入手するには、ドキュメントをチェックアウトしてください
goodniceweb

22

ここで提案されているソリューションを使用してみてください:https : //www.drupal.org/node/1129120

patch -p1 < example.patch

これは私を助けました。


3
私はあなたがこれを行うべきではないことを知っていますが、本当にありがとう!時間を節約できました。「パッチが適用されません」というエラーが発生しました。
sudo rm -rf slash

@ sudorm-rfslash、なぜこれを行うべきではないのですか、それでもなぜそれを行っていたのですか?
ブラック

git: 'patch' is not a git command.オンgit version 2.21.1 (Apple Git-122.3)
Sridhar Sarnobat

16

これは、UNIXとWindowsのgitクライアントを混在させたときに発生します。Windowsには「x」ビットの概念がないため、Windowsでのrw-r--r--(0644)ファイルのチェックアウトは、msys POSIXレイヤーによってrwx-r-xr-x(0755)に「昇格」されます。。gitはそのモードの違いは基本的にファイルのテキストの違いと同じであると見なしているため、パッチは直接適用されません。ここでの唯一の良いオプションは(を使用して)に設定core.filemodeすることです。falsegit-config

ここにいくつかの関連情報があるmsysgitの問題がありますhttp ://code.google.com/p/msysgit/issues/detail?id=164 (archive.orgの2013年12月3日のコピーに転送 )


2
コマンド「git config core.filemode false」を実行しようとしましたが、役に立ちませんでした-同じメッセージがまだ表示されます。
Dmitriiピサレンコ

ツリーにコミットされていない変更がないと仮定して、git reset --hard HEADgitに新しいオプションを有効にしてファイルを再チェックアウトするように強制してください。
ベンジャクソン

「git reset --hard HEAD」を実行してみてください。成功しました(「HEAD is now at ...」というメッセージが表示されました)が、「git apply」の問題は解決しません。
Dmitriiピサレンコ

7

私の場合、そもそもパッチファイルを誤って作成し、実際には間違った方法で差分を作成するほど愚かでした。まったく同じエラーメッセージが表示されました。

あなたがマスターで実行している場合git diff branch-name > branch-name.patch、これは発生させたいすべての追加を削除しようとし、その逆も同様です(明らかに、決して行われていない追加は削除できないため、gitが達成することは不可能でした)。

したがって、ブランチにチェックアウトして実行することを確認してください git diff master > branch-name.patch


3

警告:このコマンドは、失われた古いコミットを永久に削除できます。これを試す前に、リポジトリ全体のコピーを作成してください。

このリンクを見つけました

なぜこれが機能するのかはわかりませんが、私は多くの回避策を試しましたが、これが私のために働いた唯一のものです。つまり、以下の3つのコマンドを実行します。

git fsck --full
git reflog expire --expire=now --all
git gc --prune=now

3
これは、失われた古いコミットをreflogから永久に削除できる非常に危険なコマンドです。リポジトリが不安定な状態の場合は、これを適用しないでください。
ET

0

私が探したものは、SOのここでは正確に指摘されていません。同様のものを検索する可能性のある他の人のために書いています。1つのファイル(古いリポジトリに存在)がリポジトリから削除されるという問題に直面しました。また、パッチを適用すると、適用するファイルが見つからなかったために失敗します。(私の場合は、ファイルが削除されたためにgitパッチが失敗した場合です) '#git apply --reject'は確実にビューを提供しましたが、修正に至りませんでした。構築サーバーでは利用できないため、ウィグルを使用できませんでした。私の場合、私が適用しようとしたパッチファイルから「リポジトリで削除されたファイル」のエントリを削除することでこの問題を解決し、他のすべての変更を問題なく適用しました(3ウェイマージを使用して、空白エラー)、そして削除されたファイルのコンテンツを移動した場所に手動でマージします。


0

私の問題は、実行してから実行しgit diffgit reset --hard HEAD元に戻すことを望んでいることに気付いたため、出力をgit diffファイルにコピーしてを使用git applyしてみましたが、「パッチが適用されません」というエラーが発生しました。切り替えた後patch、それを使用しようと、私は差分の塊が何らかの理由で繰り返されたことに気づき、重複を取り除いた後patch(そしておそらくもgit apply)働きました。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.