39

私は現在、(github) リポジトリの PR でコード スタイル チェックをしようとしています。コード スタイルを簡単に修正できるパッチをサブミッターに配布したいと考えています。この目的のために、私は彼らの PR を引き出し、uncrustify スクリプトを実行してスタイル エラーを修正し、簡単に適用できる .patch ファイルを作成したいと考えています。ただし、一部のファイルでは一貫して壊れます。

私はそうします(gitバージョン1.7.10.4 with 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 にどこが間違っているのかを正確に教えてもらう方法がわかりません - 掘り下げたときに hunk# しか教えてくれませんが、それでもかなり巨大です。

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

  1. apply --reverseapply --whitespace=nowarn
  2. diff HEADdiff一人の代わりに
  3. ダミー コミットを作成する (コミットは問題なく動作します!)、 を使用する、ダミー コミットを削除する、 を使用してまたは使用せずにformat-patchパッチを適用する、または を使用して適用する git-am-3git-apply
  4. パッチファイルを1つではなくローカルディレクトリに配置します(ここではストローをつかみます)
  5. git-diff、-apply、-format-patch、-am のマンページで有用なものを確認してください
  6. linuxpatchコマンドでパッチを当てる
  7. ....

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

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

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

4

3 に答える 3

39

アップデート:

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

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

他の人が問題の説明に基づいて私が持っていたのと同じ最初の結論に飛びつくのではないかと思うので、元の回答とコメントは主に何が起こっているのかについて人々に説明するために残します。

------

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

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

他の人があなたの「マスター」レポジトリ (あなたのボットとターゲット レポジトリがプルしているレポジトリ) にコミットしている場合は、git pull両方のレポジトリにコミットしなければならない可能性があることに注意してください。

于 2013-02-01T15:48:14.567 に答える
0

このような場合、以下にリストされているすべてのオプションをすでに試した場合:

  1. ファイル内の潜在的な非表示/非表示文字の調査
  2. dos2unix変換に使用
  3. git config を変更して、次の行末の処理方法を調整します。
git config --global core.autocrlf input

このような場合のもう 1 つの悪の根源は、IDE である可能性があります。

たとえば、PHPStorm などの JetBrains IDE の一部には、次のオプションがあります。

ここに画像の説明を入力

今日、奇妙なパッチ適用の問題に4時間以上費やした後、次のエラーが発生しました:

git apply < my.git.patch --verbose
...
error: patch failed: plugins/some/file.php:74

私は自分のエディターの犠牲者であることに気付きました (これがデフォルトの動作であったかどうかはわかりません)。

私はPHPStormを使用してパッチファイルをチェックしていましたが、パッチを適用する必要があるターゲットファイルに文字通り存在する単一の空白をパッチファイルから静かに削除していました。

これは非常に卑劣で、そのような問題を二度と起こさないようにStrip trailing spaces on Save forオプションを設定することになりました。None

また、基盤となるファイルシステム (MacOS/Linux など) の大文字と小文字の区別など、プラットフォームに関連する違いも疑わしい場合があることに注意してください。

于 2020-06-17T16:17:12.810 に答える