web-dev-qa-db-ja.com

git-applyが不可解に失敗します。トラブルシューティング/修正方法を教えてください。

現在、(github)リポジトリのPRをコードスタイルチェックしようとしていますが、コードスタイルを簡単に修正できるパッチを提出者に配布したいと考えています。そのために、PRを削除し、スタイルエラーを修正するためにuncrustifyスクリプトを実行し、簡単に適用できる.patchファイルを作成します。ただし、一部のファイルでは常に破損します。

私はそうします(gitバージョン1.7.10.4で_core.autocrlf=input_、_core.filemode=false_):

_$ git checkout pr-branch
$ git log -1 (shows: commit dbb8d3f)
$ git status (nothing to commit, working directory clean)
$ <run the code styler script, which modifies some files>
$ git diff > ../style.patch (so the patch file lands outside the repo)
$ git reset --hard HEAD (to simulate the situation at the submitter's end)
$ git log -1 (shows: commit dbb8d3f)
$ git status (nothing to commit, working directory clean, so we are where we started)
$ git apply ../style.patch
error: patch failed: somefile.cpp:195
error: somefile.cpp: patch does not apply (same output using the --check option)
_

これはすべてのファイルではなく、一部のファイルにのみ適用されます。私はこれをトラブルシューティングする方法がわかりません。つまり、gitに問題の正確な場所を教えてもらう方法はわかりません-私が掘ったときにハンク#だけを教えてくれますが、それはまだかなり巨大です。

私がこれまでに試したこと(成功なし):

  1. _apply --reverse_、_apply --whitespace=nowarn_
  2. diffだけではなく_diff HEAD_
  3. ダミーコミットを作成し(問題なくコミットできます!)、_format-patch_を使用し、ダミーコミットを削除し、_git-am_の有無にかかわらず_-3_を使用してパッチを適用するか、_git-apply_を使用して適用します
  4. パッチファイルを1つではなくローカルディレクトリに配置します(ここでストローをつかみます)。
  5. Git-diff、-apply、-format-patch、-amのマンページで有用なものを確認してください
  6. linux patchコマンドを使用したパッチ
  7. ....

Diffの何が問題なのかわかりません。空白は警告するだけですよね?いずれにしても、明らかに空白を含むスタイル修正であるため、それらを無視したくありません。

どうすればこれを修正/診断できますか?犯人ファイルの1つの差分を投稿すると役立ちますか?私が困惑させているのは、コミットが問題なく機能するのに、コミットから作成されたパッチが機能しないということです。

数時間これと格闘した後、私は知識の終わりにいます...

31
Christoph

更新:

git apply -vを使用して、何が起こっているかについての詳細情報を表示するか、git apply --checkを使用して操作を確認するか、git apply --indexを使用してローカルインデックスファイルを再構築できます。

コメントに基づいて、ローカルインデックスが破損しているようで、indexが解決したようです。

他の人が問題の説明に基づいて私が持っていたのと同じ最初の結論にジャンプするのではないかと疑うので、私は元の答えとコメントを主に人々に何が起こっているのかコンテキストを与えるために残します。

------

ほとんどの場合、diffに問題はありません。代わりに、ターゲットgitリポジトリを見てください。 git reset --hard HEADを実行している間、他のリポジトリのHEADがあなたのHEADと同じであることを保証するものはありません。

ターゲットリポジトリでgit logを実行し、上部のコミットを確認します。 diffを作成したものと同じですか?ほとんどの場合そうではありません。履歴を調べて、必要なコミットがあるかどうかを確認します。もしそうなら、ターゲットレポジトリはあなたのものより先にあり、あなたは戻って、git pull(またはgit rebase)を実行し、新しい差分を生成する必要があります。そうでない場合は、ターゲットリポジトリが背後にあるため、ターゲットリポジトリでgit pull(またはgit rebase)を実行して速度を上げる必要があります。

「マスター」レポジトリ(ボットレポジトリとターゲットレポジトリがプルしているレポジトリ)にコミットしている他の人がいる場合、git pull両方のレポジトリを合理的に最新の状態に戻す必要があります一般的なコミット。

32
Franci Penov

パッチファイルをチェックしてみてください-例:

git apply --reject mypatch.patch

これは、もしあれば違いを示します-これはどのように見えるかの例です:

error: patch failed: <filename>:<linenumber>
error: while searching for :
    cout << "}" << endl; // example of a line in your patch
7
serup