git: yama geçerli değil


289

My_pcc_branch.patch adında belirli bir düzeltme ekim var.

Uygulamayı denediğimde aşağıdaki mesajı alıyorum:

$ 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

Bu ne demek?

Bu sorunu nasıl düzeltebilirim?


Etrafta yatan AbstractedPanel.java.rej dosyası var mı? Tipik olarak bu, bir satır botunun kaynakta ve yamada değiştiği anlamına gelir (burada hat 13 etkilenmiş gibi görünüyor).
Rudi

Hayır, herhangi bir * .rej dosyası bulamadım.
Dmitrii Pisarenko

Kabul edilen cevabın neden düzelttiğinden emin değilim (bu yüzden kırmızı bir ringa balığı olduğundan şüpheleniyorum), ancak has type 100644, expected 100755bir yerde chmod izinleri uyuşmazlığı olduğu anlamına gelmiyor mu?
56'da ruffin

Yanıtlar:


325

git apply --reject --whitespace=fix mychanges.patch benim için çalıştı.

açıklama

Bu --rejectseçenek git'e bir yamanın nasıl uygulanacağını belirleyememesi durumunda başarısız olmamasını söyler, ancak bunun yerine bireysel öbekleri uygulamak, uygulayamayacağı önseziler için reddetme dosyaları ( .rej) uygulayabilir ve oluşturabilir . Wiggle “bu [reddedilmiş] yamaları uygulayabilir ve sözcük bazında farklılıklar gerçekleştirebilir”.

Ayrıca, --whitespace=fixbeyaz boşluk hataları hakkında uyarır ve başka türlü uygulanabilir bir yığın uygulamayı reddetmek yerine bunları düzeltmeye çalışır.

Her iki seçenek birlikte bir yamanın uygulanmasını hataya karşı daha sağlam hale getirir, ancak sonuçla ilgili ek dikkat gerektirirler.

Tüm belgeler için bkz. Https://git-scm.com/docs/git-apply .



10
Bu harika. Sadece kendisini çözemediği şeyi reddeder ve sonra reddedilen dosyaları manuel olarak değiştirebilirsiniz.
Dennis

1
patch -p1 <mychanges.patch #, yığın tarafından yığın değişiklikleri uygular. Değişiklikler başarısız olursa, <sourcefile> .orig ve <sourcefile> .rej yaması oluşturulur ve değişiklikleri el ile uygulayabilirsiniz. Git uygulamak tahmin ediyorum - reject aynı yapar ve --whitespace = fix sihirli bir şekilde daha iyidir.
gaoithe

7
bu komut .rejyama nasıl uygulanacağını otomatik olarak algılayamadığında dosyalar oluşturur . Bu tür sorunları çözmek için kıpırdatmayı kullanabilirsiniz .
16:21:21

14
Bu cevap hiçbir şeyi açıklamaz, özellikle hangi durumlarda işe yarayacağını. İnsanlar, gerçekten cevap kalitesi daha talepkar olmak zorunda, bu bir forum değil.
Oliver

319

Msysgit@googlegroups.com posta listesinden Johannes Sixt, aşağıdaki komut satırı bağımsız değişkenleri kullanılarak önerildi:

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

Bu benim sorunumu çözdü.


25
Biri bana yardım edebilir ve bunun neden çalıştığını açıklayabilir mi? Diğer cevap benim için işe yaramadı ve ben askerin tarif ettiği soru ile aynı problemi yaşadım. Dosya özniteliklerinin boşlukları yoksaymakla ne ilgisi var?
skrebbel

1
Windows powershell kullanma git diff ile yapılan bir yama başarıyla şu şekilde uygulandı: git diff HEAD..613fee - myfile.xml | git uygula --ignore-space-change --ignore-whitespace, oysa öncelikle diff çıktısını bir dosya olarak kaydetmek işe yaramazsa, herkes aynı problemle karşılaşırsa
tjb

2
Ayrıca -C1uygulama için geçiş deneyin , önemli olarak kabul eklerin bağlamını azaltır.
Amir Ali Akbari

2
@EricWalker, CR / LF ile git büyü mutlaka kötü bir şey değildir. Alternatif olarak, değişiklik kümelerinizin yarısı, dokunulan her dosyadaki bir satırdan diğerine biten her satırdan oluşur ve gerçek değişiklik ortada bir yere gömülür.
jwg

3
Bu bazen yardımcı olur. Ancak diğer zamanlarda, yama sorunsuz uygulansa da, "yama geçerli değil" i hala alıyorum.
Thomas Levesque

118

Herkes başarısız olduğunda, deneyin git apply'ın --3wayseçeneği .

git apply --3way patchFile.patch

--3way
Düzeltme eki temiz bir şekilde uygulanmadığında, düzeltme ekinin başvurması gereken lekelerin kimliğini kaydetmesi durumunda 3 yönlü birleştirme işlemine geri dönün ve bu kesintileri yerel olarak kullanılabilir hale getirdik. kullanıcının çözmesi için çalışma ağacı. Bu seçenek --index seçeneğini belirtir ve --reject ve --cached seçenekleriyle uyumsuzdur.

Tipik başarısızlık durumu, olabildiğince çok düzeltme ekini uygular ve git'de çalışmak için çakışmalara neden olur, ancak normalde bunu yaparsınız. Muhtemelen rejectalternatiften bir adım daha kolay .


2
Benim için işe yarayan cevap bu. Düzeltme yaptığım dosya, düzeltme ekini oluşturduğum değişiklikleri yansıtmadı (düzeltme ekini oluşturduktan sonra değişiklikleri sildim.)
Christia

3
Güzel genel çözüm. 3 yollu fark normalde bununla biraz karışmış gibi görünmüyordu, ama asla daha az bu bana çatışmayı çözme ve yamayı uygulayabilme yeteneği verdi.
steinybot

8
Bunun --3wayvarsayılan davranış olması gerektiğini düşünüyorum . Yama başarısız olduğunda, en azından bana neyin başarısız olduğunu söyle, böylece elle düzeltebilirim. git applysadece başarısız olur ve bir şeyin neden başarısız olduğunu bildirmez. *.rejOluşturdukları gibi dosyaları bile bulamadım hg.
Pavan Manjunath

4
Kesinlikle, en iyi çözüm. Kullanıcının kendi çatışmalarını çözmesine izin verin!
Mosh Feu

56

Bu komut, düzeltme ekini, kötü dosyaları şu şekilde bırakarak çözemez *.rej:

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

Onları çözmek zorundasınız. Çözüldükten sonra çalıştırın:

git -am resolved

7
nasıl çözülür *.rej- tüm bulabileceğim değişiklikleri kaynak dosyada manuel olarak yapmak ve bu .rejdosyaları silmek . Başka yolu var mı?
coding_idiot

1
@coding_idiot Her zamanki gibi .rej dosyalarını kontrol edin, çakışan dosyalarla karşılaştırın ve son olarak sabit dosyaları dizine ekleyin ("git add FIXED_FILES" ile)
Ivan Voroshilin

2
@coding_idiot çözmek için kıpırdatmayı kullanabilirsiniz . Örneğin: wiggle --replace path/to/file path/to/file.rej. Bu komut, .rejdosyadan orijinal dosyaya değişiklikler uygular . Ayrıca orijinal dosyanın bir kopyasını oluşturur path/to/file.porig.
Wiggle

22

Burada önerilen çözümü kullanmayı deneyin: https://www.drupal.org/node/1129120

patch -p1 < example.patch

Bu bana yardımcı oldu.


3
Bunu yapmaman gerektiğini biliyorum, ama ÇOK TEŞEKKÜR EDERİZ! Beni saatlerce kurtardı. "Yama geçerli değil" ve her türlü hata alıyordum.
sudo rm -rf slash

@ sudorm-rfslash, bunu neden yapmamız gerekmiyor ve yine de neden yapıyordunuz?
Siyah

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

16

UNIX ve Windows git istemcilerini karıştırdığınızda gerçekleşir, çünkü Windows gerçekten "x" biti konseptine sahip değildir, bu nedenle rw-r--r--Windows altındaki bir (0644) dosyasını teslim alma işleminiz msys POSIX katmanı tarafından "tanıtılır" rwx-r-xr-x(0755) . git, mod farkının temel olarak dosyadaki metinsel farkla aynı olduğunu düşünür, bu nedenle yamanız doğrudan uygulanmaz. Ben burada sadece iyi bir seçenek ayarlamak olduğunu düşünüyorum core.filemodeiçin false(kullanarak git-config).

İlgili bazı bilgilerle ilgili msysgit sorunu: http://code.google.com/p/msysgit/issues/detail?id=164 (archive.org'un 3 Aralık 2013 kopyasına yeniden yönlendirildi)


2
"Git config core.filemode false" komutunu çalıştırmayı denedim, ama yardımcı olmadı - hala aynı mesajı alıyorum.
Dmitrii Pisarenko

Ağacınızda herhangi bir taahhütlü değişiklik olmadığınızı varsayarsak, git reset --hard HEADyürürlükteki yeni seçenekle git'i dosyalarınızı yeniden teslim almaya zorlayın.
Ben Jackson

Sadece denemek "git reset --hard HEAD" yürütmek çalıştı. Başarılı oldu ("HEAD şu anda ..." mesajını gördüm), ancak "git uygula" sorunu devam ediyor.
Dmitrii Pisarenko

7

Benim durumumda, yama dosyasını ilk etapta yanlış oluşturmak için yeterince aptaldım, aslında yanlış şekilde farklıydı . Sonunda aynı hata mesajlarını buldum.

Usta ve yapıyorsanız git diff branch-name > branch-name.patch, bu gerçekleşmek istediğiniz tüm eklemeleri kaldırmaya çalışır ve bunun tersi de geçerlidir (git'in başarması imkansızdı, çünkü açıkça yapılmayan eklemeler kaldırılamaz).

Bu yüzden şubenize ödeme yaptığınızdan ve git diff master > branch-name.patch


3

UYARI: Bu komut, eski kayıp taahhütleri KALICI OLARAK kaldırabilir. Bunu denemeden önce tüm deponuzun bir kopyasını oluşturun.

Bu bağlantıyı buldum

Bunun neden işe yaradığına dair hiçbir fikrim yok ama birçok çalışmayı denedim ve bu benim için çalışan tek şey. Kısacası, aşağıdaki üç komutu çalıştırın:

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

3
Bu, eski kayıp taahhütleri reflogdan sonsuza kadar kaldırabilen çok tehlikeli bir komuttur. Reponunuz titrek bir durumdaysa, BU UYGULAMAYIN.
ET

0

Aradığım şey burada SO'da tam olarak işaret edilmiyor, benzerleri arayabilecek başkalarının yararına yazıyorum. Bir dosyada (eski depoda mevcut) bir sorunla karşılaştığımda sorunla karşılaştım. Düzeltme ekini uyguladığımda, uygulanacak dosyayı bulamadığı için başarısız oluyor. (benim durumum git yama dosya kaldırıldı için başarısız olur) '#git uygulamak --reject' kesinlikle bir görünüm verdi ama oldukça düzeltmek için beni alamadım. Kıpırdatmayı yapı sunucularımızda bizim için mevcut olmadığı için kullanamadım. Benim durumumda, uygulamayı denediğim yama dosyasından 'repo'da kaldırılan dosyanın' girişini kaldırarak bu sorunu çözdüm, bu yüzden diğer tüm değişiklikleri bir sorun olmadan uyguladım (3 yönlü birleştirme kullanarak, kaçınarak boşluk), Ve sonra kaldırılan dosyanın içeriğini elle taşındığı yere.


0

Benim sorunum ben koştu git diffsonra koştu git reset --hard HEAD, sonra geri almak istediğini fark, bu yüzden çıktı git diffbir dosyaya kopyalamak ve kullanarak denedim git apply, ama "yama geçerli değildir" bir hata var. Geçtikten sonra patchve kullanmaya çalışınca, ben fark bir yığın nedense tekrarlandı olduğunu fark etti ve yinelenen çıkardıktan sonra , patch(ve muhtemelen de git apply) çalıştı.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.