17

浅いクローンがあり、その上で3つのコミットを行いました。ログは次のとおりです。

$ git log --oneline --graph --decorate --all
* d3456fd(HEAD、master)patch 3
* 9713822 patch 2
* 6f380a6 patch 1
* 8a1ce1e(origin / master、origin / HEAD)from full clone
*7c13416追加元浅い
*3b3ed39削除された電子メール
*cfbed6cさらなる変更
*リリース2.1用に追加されたa71254b
*リリース2用の7347896(移植)変更

今、私はここからパッチを作成します:

$ git format-patch -k --stdout origin> ../format_since_origin.patch

このパッチを、完全なクローンである別のクローンに適用したいと思います。
ログは次のとおりです。

$ git log --oneline --graph --decorate --all
*フルクローンからの8a1ce1e(HEAD、origin / master、master)
*浅いところから追加された
7c13416*3b3ed39削除された電子メール
*cfbed6cさらなる変更
*リリース2.1用に追加された
a71254b*7347896リリース2の
変更*b1a8797ttwoファイル
の変更*603710cテストレポートの変更
*16b20b3追加test_report.txt
*f0871ea変更file1.xml
*dd94bfc追加file1.xml
*00758aa2番目のコミット
*49f9968最初のコミット

上記の浅いクローンから作成したパッチを適用できません。次のエラーが発生します。

$ git am -3 /c/temp/git/format_since_origin.patch
適用:パッチ1
インデックス情報を使用してベースツリーを再構築しています...
エラー:パッチが失敗しました:file1.c:6
エラー:file1.c:パッチが適用されません
パッチを手作業で編集しましたか?
インデックスに記録されたblobには適用されません。
スリーウェイマージにフォールバックすることはできません。
パッチは0001パッチ1で失敗しました
この問題を解決したら、「gitam--resolved」を実行します。
このパッチをスキップしたい場合は、代わりに「gitam--skip」を実行してください。
元のブランチを復元してパッチの適用を停止するには、「gitam--abort」を実行します。

このパッチが失敗する理由はありますか?それとも私の方法は完全に間違っていますか?

アップデート:

それは以下で動作します

$ git am -3 --ignore-whitespace /c/temp/git/format_since_origin.patch適用:パッチ1適用:パッチ2適用:パッチ3

チャールズが提案したように、git diffを試してみると、次のようなエラーが発生します。

$ git diff -p origin> ../dif_origin.patch

お申し込みの際、

$ git apply --ignore-whitespace --inaccurate-eof /c/temp/git/dif_origin.patch
c:/temp/git/dif_origin.patch:9:末尾の空白。
file1.cのパッチ変更
c:/temp/git/dif_origin.patch:18:末尾の空白。
このxmlガイにパッチを当てる
c:/temp/git/dif_origin.patch:29:末尾の空白。
fsdfsd
c:/temp/git/dif_origin.patch:30:末尾の空白。
このレポートにパッチを適用するエラー:パッチが失敗しまし
た:file1.c:6
エラー:file1.c:パッチが適用されません
エラー:パッチが失敗しました:file1.xml:2
エラー:file1.xml:パッチが適用されません
エラー:パッチが失敗しました:tr / test_report.txt:2
エラー:tr / test_report.txt:パッチが適用されません

4

3 に答える 3

18

空白を無視しなければならない理由の 1 つは ( 2010 年 6 月)であることに注意してください。

それが行うことは、を有効にすることGMail -> download -> git-am workflowです。
GMail (およびその他の無数の電子メール プロバイダ) は、未加工の電子メール メッセージの先頭に空白を挿入しますが、それ以外はそのままにします。

git am/format-patch: 行末の制御形式」で述べたように、次のことを試すことができます。

 git am --keep-cr

空白を無視する必要はありません (警告のみ)。

OP maxmelbin、コメントで次のように機能することを確認します。

 git am -3 --keep-cr --committer-date-is-author-date /c/temp/git/format_since_origin.patch
于 2012-11-02T07:15:38.473 に答える
14

git apply が正常に動作している場合、何も出力されません。

$ git apply example.patch
[nothing returned]

舞台裏で何が起こっているかを見たい場合は、-v (詳細) フラグを使用できます。

$ git apply -v example.patch
Checking patch includes/common.inc...
Applied patch includes/common.inc cleanly.

ただし、独自のローカル git 作業コピー内から git apply を実行する場合、-v (詳細) フラグを使用しても、git apply は何も実行せず、何も出力しない可能性があります。これが発生した場合は、ディレクトリ ツリー内の場所を確認してください。git apply は別の場所から動作する場合があります。

git apply の代わりに patch コマンドを使用することもできます:

$ patch -p1 < example.patch

git apply コマンドが生成できるその他の出力とその意味を次に示します。パッチは適用されません

$ git apply example.patch
error: patch failed: includes/common.inc:626
error: includes/common.inc: patch does not apply``

問題のコード行が見つからなかったため、Git はパッチの変更を適用できませんでした。それらは別のコミットによって変更または削除されている必要があります。次のことを試してください。

パッチがまだ適用されていないことを確認してください。git-log でそれを探すか、単純にコードを調べて、変更が既に存在するかどうかを確認してください。もしそうなら、あなたは終わりです。そうでない場合、または一部だけがそうである場合は、別の方法を試してください。

を使用しpatch -p1 < filename.patchます。git-apply はエラーのあるパッチを完全に拒否しますが、 patch -p1 はハンクごとに機能し、可能な限り多くの個別の変更を適用します。各ファイルを変更する前に filename.ext.orig としてバックアップし、拒否されたハンクを に保存しfilename.ext.rejます。.orig ファイルを破棄し、.rej に残っている変更を手動で適用します。これは、小さなパッチに対する簡単な戦略です。

于 2014-11-18T11:50:24.903 に答える
9

わかった。以下はうまくいきました。

$ git am -3 --ignore-whitespace /c/temp/git/format_since_origin.patch
適用中: パッチ 1
適用中: パッチ 2
適用中: パッチ 3

于 2012-11-02T07:01:54.463 に答える