git: patch tidak berlaku

289

Saya memiliki patch tertentu yang disebut my_pcc_branch.patch.

Ketika saya mencoba menerapkannya, saya mendapat pesan berikut:

$ 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

Apa artinya?

Bagaimana saya bisa memperbaiki masalah ini?

Dmitrii Pisarenko
sumber
Apakah ada file AbstractedPanel.java.rej yang ada? Khas ini berarti bahwa bot garis diubah dalam sumber maupun di tambalan (di sini baris 13 tampaknya terpengaruh).
Rudi
Tidak, saya tidak menemukan file * .rej.
Dmitrii Pisarenko
Tidak yakin mengapa jawaban yang diterima akan memperbaikinya (jadi saya curiga ini adalah herring merah), tetapi tidak has type 100644, expected 100755menyiratkan ada ketidakcocokan izin chmod di suatu tempat?
ruffin

Jawaban:

325

git apply --reject --whitespace=fix mychanges.patch bekerja untukku.

Penjelasan

The --rejectpilihan akan menginstruksikan git untuk tidak gagal jika tidak dapat menentukan bagaimana menerapkan patch, melainkan untuk menerapkan bakhil indivdual dapat menerapkan dan menciptakan menolak file ( .rej) untuk bakhil itu tidak bisa berlaku. Goyangan dapat "menerapkan tambalan yang ditolak ini dan melakukan perbedaan kata-kata".

Selain itu, --whitespace=fixakan memperingatkan tentang kesalahan spasi putih dan mencoba memperbaikinya, daripada menolak untuk menerapkan sebongkah yang berlaku.

Kedua opsi bersama-sama membuat aplikasi patch lebih kuat terhadap kegagalan, tetapi mereka membutuhkan perhatian tambahan sehubungan dengan hasilnya.

Untuk seluruh dokumentasi, lihat https://git-scm.com/docs/git-apply .

pengguna1028904
sumber
8
Ini sebenarnya bekerja lebih baik untuk saya karena tidak sepenuhnya mengubah file saya
Wayne Werner
10
Ini bagus. Tolak saja apa yang tidak dapat dipecahkan dengan sendirinya dan Anda kemudian dapat memodifikasi file yang ditolak secara manual.
Dennis
1
patch -p1 <mychanges.patch # menerapkan perubahan chunk by chunk. Jika perubahan gagal tambalan <sourcefile> .orig dan <sourcefile> .rej dibuat dan Anda dapat menerapkan perubahan secara manual. Saya kira git menerapkan --reject melakukan hal yang sama dan --whitespace = memperbaiki secara ajaib lebih baik.
gaoithe
7
perintah ini membuat .rejfile ketika tidak dapat secara otomatis mendeteksi cara menerapkan tambalan. Anda dapat menggunakan goyangan untuk menyelesaikan masalah tersebut.
goodniceweb
14
Jawaban ini tidak menjelaskan apa pun, khususnya dalam hal apa ia akan berfungsi. Teman-teman, Anda benar-benar harus lebih menuntut kualitas jawaban, ini SANGAT bukan forum.
Oliver
319

Johannes Sixt dari milis [email protected] disarankan menggunakan argumen baris perintah berikut:

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

Ini menyelesaikan masalah saya.

Dmitrii Pisarenko
sumber
25
Adakah yang bisa membantu saya dan menjelaskan mengapa ini berhasil? Jawaban lainnya tidak berhasil untuk saya, dan saya memiliki masalah yang sama persis dengan apa yang dijelaskan oleh penanya. Apa kaitan atribut file dengan mengabaikan spasi putih?
skrebbel
1
Menggunakan windows powershell Patch yang dibuat dengan git diff berhasil diterapkan sebagai berikut: git diff HEAD..613fee - myfile.xml | git menerapkan --ignore-space-change --ignore-whitespace, di mana pertama-tama menyimpan output diff sebagai file tidak berfungsi, kalau-kalau ada yang mengalami masalah yang sama
tjb
2
juga coba -C1aktifkan untuk diterapkan, itu mengurangi konteks sekitar penambahan yang dianggap penting.
Amir Ali Akbari
2
@EricWalker, git magic dengan CR / LF belum tentu buruk. Alternatifnya adalah separuh dari perubahan Anda terdiri dari setiap baris di setiap file yang disentuh diubah dari satu baris ke yang lainnya, dengan perubahan yang sebenarnya terkubur di suatu tempat di tengah.
jwg
3
Ini kadang membantu. Tetapi di lain waktu, saya masih mendapatkan "tambalan tidak berlaku", meskipun tambalan harus berlaku tanpa masalah.
Thomas Levesque
118

Ketika semuanya gagal, coba git apply's --3waypilihan .

git apply --3way patchFile.patch

--3way
Ketika tambalan tidak berlaku dengan bersih, kembalilah ke penggabungan 3-arah jika tambalan mencatat identitas gumpalan yang seharusnya berlaku, dan kami memiliki gumpalan itu tersedia secara lokal, mungkin meninggalkan penanda konflik dalam file di pohon yang berfungsi untuk diselesaikan oleh pengguna. Opsi ini menyiratkan opsi --index, dan tidak kompatibel dengan opsi --reject dan --cached.

Kasing kegagalan yang umum berlaku sebanyak patch yang bisa, dan meninggalkan Anda dengan konflik untuk bekerja di git namun Anda biasanya melakukannya. Mungkin satu langkah lebih mudah daripada rejectalternatifnya.

ruffin
sumber
2
Inilah jawaban yang berhasil untuk saya. File yang saya tambal tidak mencerminkan perubahan yang saya hasilkan dari tambalan (karena saya menghapus perubahan setelah saya membuat tambalan.)
Christia
3
Solusi umum yang bagus. Perbedaan 3way sepertinya tidak begitu membingungkan, tetapi hal ini membuat saya mampu menyelesaikan konflik dan mendapatkan patch untuk diterapkan.
steinybot
8
Saya pikir ini --3wayharus menjadi perilaku default. Ketika patching gagal, setidaknya beri tahu saya apa yang gagal sehingga saya bisa memperbaikinya secara manual. git applyhanya gagal dan tidak melaporkan mengapa sesuatu gagal. Saya bahkan tidak dapat menemukan *.rejfile seperti yang hgdihasilkan.
Pavan Manjunath
4
Pastinya, solusi terbaik. Biarkan pengguna menyelesaikan konfliknya sendiri!
Mosh Feu
56

Perintah ini akan menerapkan tambalan yang tidak menyelesaikannya meninggalkan file yang buruk sebagai *.rej:

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

Anda hanya perlu mengatasinya. Setelah diselesaikan, jalankan:

git -am resolved
Ivan Voroshilin
sumber
7
cara mengatasi *.rej- yang bisa saya temukan adalah membuat perubahan secara manual di file sumber & menghapus .rejfile - file ini . Ada cara lain?
coding_idiot
1
@coding_idiot Seperti biasa, Cukup periksa file .rej, bandingkan dengan file yang bertentangan dan akhirnya tambahkan file yang diperbaiki ke indeks (dengan "git add FIXED_FILES")
Ivan Voroshilin
2
@coding_idiot Anda bisa menggunakan gerak untuk mengatasinya. Sebagai contoh: wiggle --replace path/to/file path/to/file.rej. Perintah ini akan menerapkan perubahan dari .rejfile ke file asli. Juga membuat salinan file asli, seperti path/to/file.porig. Silakan, cek dokumentasi untuk mendapatkan info lebih lanjut tentang
goyangan
22

Coba gunakan solusi yang disarankan di sini: https://www.drupal.org/node/1129120

patch -p1 < example.patch

Ini membantu saya.

Pini Cheyni
sumber
3
Saya tahu Anda tidak seharusnya melakukan ini, tetapi TERIMA KASIH BANYAK BANYAK! Menyelamatkan saya berjam-jam. Saya mendapatkan "tambalan tidak berlaku" dan segala macam kesalahan.
sudo rm -rf slash
@ sudorm-rfslash, mengapa kita tidak melakukan ini dan mengapa Anda melakukannya?
Hitam
git: 'patch' is not a git command.padagit version 2.21.1 (Apple Git-122.3)
Sridhar Sarnobat
16

Ini terjadi ketika Anda mencampur klien UNIX dan Windows git karena Windows tidak benar-benar memiliki konsep bit "x" sehingga checkout Anda dari file rw-r--r--(0644) di Windows "dipromosikan" oleh lapisan POSIX msys menjadi rwx-r-xr-x(0755) . git menganggap bahwa perbedaan mode pada dasarnya sama dengan perbedaan tekstual pada file, jadi tambalan Anda tidak secara langsung berlaku. Saya pikir satu-satunya pilihan yang baik di sini adalah untuk mengatur core.filemodeke false(menggunakangit-config ).

Berikut ini adalah masalah msysgit dengan beberapa info terkait: http://code.google.com/p/msysgit/issues/detail?id=164 (dialihkan ke salinan 3 Desember 2013 archive.org)

Ben Jackson
sumber
2
Saya mencoba menjalankan perintah "git config core.filemode false", tetapi tidak membantu - saya masih mendapatkan pesan yang sama.
Dmitrii Pisarenko
Dengan anggapan Anda tidak memiliki perubahan yang tidak dikomit di pohon Anda, cobalah git reset --hard HEADuntuk memaksa git untuk checkout kembali file Anda dengan opsi baru yang berlaku.
Ben Jackson
Baru saja mencobanya jalankan "git reset --hard HEAD". Itu berhasil (saya melihat pesan "HEAD is at at ..."), tetapi masalah dengan "git apply" tetap ada.
Dmitrii Pisarenko
7

Dalam kasus saya, saya cukup bodoh untuk membuat file tambalan secara salah, sebenarnya berbeda dengan cara yang salah . Saya berakhir dengan pesan kesalahan yang sama persis.

Jika Anda menguasai dan melakukannya git diff branch-name > branch-name.patch , ini mencoba untuk menghapus semua tambahan yang Anda inginkan terjadi dan sebaliknya (yang tidak mungkin dilakukan oleh git karena, jelas, penambahan yang pernah dilakukan tidak dapat dihapus).

Jadi pastikan Anda checkout ke cabang Anda dan jalankan git diff master > branch-name.patch

Ophidian
sumber
3

PERINGATAN: Perintah ini dapat menghapus komit yang hilang lama secara PERMANEN. Buat salinan dari seluruh repositori Anda sebelum mencoba ini.

Saya telah menemukan tautan ini

Saya tidak tahu mengapa ini bekerja tetapi saya mencoba banyak pekerjaan dan ini adalah satu-satunya yang bekerja untuk saya. Singkatnya, jalankan tiga perintah di bawah ini:

git fsck --full
git reflog expire --expire=now --all
git gc --prune=now
Archmede
sumber
3
Ini adalah perintah yang sangat berbahaya yang dapat menghapus komit lama yang hilang selamanya dari reflog. Jika repo Anda dalam kondisi goyah, JANGAN LAKUKAN INI.
ET
0

Apa yang saya cari tidak tepat ditunjukkan di sini di SO, saya menulis untuk kepentingan orang lain yang mungkin mencari yang serupa. Saya menghadapi masalah dengan satu file (ada di repo lama) dihapus di repo. Dan ketika saya menerapkan tambalan, gagal karena tidak dapat menemukan file yang akan diterapkan. (jadi kasus saya adalah git patch gagal untuk file dihapus) '#git apply --reject' jelas memberikan pandangan tetapi tidak cukup membuat saya untuk memperbaikinya. Saya tidak dapat menggunakan goyangan karena tidak tersedia untuk kami di server build kami. Dalam kasus saya, saya menyelesaikan masalah ini dengan menghapus entri 'file yang dihapus dalam repo' dari file patch yang saya coba terapkan, jadi saya mendapatkan semua perubahan lain yang diterapkan tanpa masalah (menggunakan penggabungan 3 cara, menghindari white space error), Dan kemudian secara manual menggabungkan konten file yang dihapus ke tempat dipindahkannya.

Bhanu
sumber
0

Masalah saya adalah saya berlari git diff, lalu berlari git reset --hard HEAD, kemudian menyadari bahwa saya ingin membatalkan, jadi saya mencoba menyalin output dari git diffke dalam file dan menggunakan git apply, tetapi saya mendapat kesalahan bahwa "patch tidak berlaku". Setelah beralih ke patchdan mencoba menggunakannya, saya menyadari bahwa sepotong diff diulang karena alasan tertentu, dan setelah menghapus duplikat , patch(dan mungkin juga git apply) bekerja.

Solomon Ucko
sumber