Git kurulmadan `git diff` yaması nasıl uygulanır?


280

git diffMüşterim git git olmadan oluşturulan yamayı nasıl uygulayabilir ? patchKomutu kullanmayı denedim ama her zaman dosya adını yama istiyor.


4
Düzeltme eki yeniden adlar içeriyorsa bunu nasıl bilebilir? Düzeltme eki şu anda yerel olarak destekliyor mu?
Paul Crowley

3
Soru gerçekten şöyle olmalıdır: git yüklü olmadan git farkını uygulamanın bir yolu var mı? Aşağıda belirtildiği gibi , patchbu biçimi tam olarak desteklemez.
Aryeh Leib Taurog

Yanıtlar:


425
git diff > patchfile

ve

patch -p1 < patchfile

iş ama yorumlarda ve diğer cevaplarda fark birçok kişi yama anlamıyor anlamıyor, siler ve yeniden adlandırır. Seçenek yok ama git apply patchfiledosya ekler, siler ve yeniden adlandırır işlemek gerekiyorsa.


EDIT Aralık 2015

patchKomutun en son sürümleri (2.7, Eylül 2012'de piyasaya sürüldü) , "diff --git" biçiminin, yeniden adlandırma ve kopyalar, izin değişiklikleri ve symlink diffs (ancak henüz ikili değil) dahil birçok özelliğini destekler ( sürüm duyurusu ).

Bu nedenle, mevcut / en son sürümünü patchkullandığı gittakdirde, farkını bir yama olarak uygulayabilmek için kullanmaya gerek yoktur .


97
Veya kullanın git diff > patchfile, amapatch -p1 < patchfile
Jakub Narębski

11
Deponun bir alt yolunun bir yama dosyasını oluşturmak istiyorsanız, aşağıdaki relativeseçeneği kullanabilirsiniz :git diff --no-prefix --relative=my/relative/path > patchfile
Koen.

2
patch -p1 < patchfilegit'in yüklü olmasını gerektirmez. İlk komut diff oluşturma, onu uygulama komutunu gösterir.
Andrey Kuznetsov

1
Oluşturulan bu yama değişiklikler için gelen komutta belirtilen dal / refspec için mevcut veya etkin dal. Başka bir deyişle, istediğiniz git diff from_branch > patchfile; git checkout from_branch; git patch -p1 < patchfileveyagit diff from_branch to_branch > patchfile; ...
ocak

1
@PaulChechetin egor83'ün suppie'nin cevabında söylediği gibi başlangıçta eğik çizgiler çıkıyor.
Andrey Kuznetsov

75

bunu dene:

patch -p1 < patchfile

4
-P1 argümanı ne işe yarar?
chrisjlee

8
Şeritler başlangıçta eğiktir. Bkz adam yama
egor83

16
@chrisjlee çıktıya ön ekler ve önek git diffkoyar , bu nedenle yama dosyasını uygulamak için bunları ihmal eder. a/b/patch -p1
wberry

49

kullanım

git apply patchfile

Eğer mümkünse.

patch -p1 < patchfile 

potansiyel yan etkisi vardır.

git applydosya git diffbiçiminde tanımlanırlarsa dosya ekleme, silme ve yeniden adlandırma işlemlerini patchde gerçekleştirir. Son olarak, git applyya her şeyin uygulandığı ya da hiçbir şeyin olmadığı bir "tümünü uygula ya da hepsini iptal et" modeli, yama ise yama dosyalarını kısmen uygulayarak çalışma dizininizi tuhaf bir durumda bırakabilir.


1
+1, Tek aklı başında cevap. Dahası, diff / patch sembol bağlantılarını işlemez, bu da (örneğin) 3.10 Linux çekirdek yamasını geri döndürüyorsanız bir sorundur.
ignis

10
Evet, git applybunu yapmanın en iyi yoludur, ancak bu soru özellikle yamanın Git yüklü olmadan nasıl uygulanacağını sormaktadır .
Colin D Bennett

1
--dry-run --verboseVarsa yan etkilerin ne olacağını belirlemek için seçenekler yararlıdır. (v2.5.8 yamasını kullanarak)
spyle

@ignis - " git apply patchfile -... tek aklı başında cevap ..." - neredeyse gülünç. OpenSSL geliştiricileri test etmem için bana bir yama gönderdiğinde Git uygulayamaz. Budur her zaman. Henüz aptal aracın bir yama uyguladığını görmedim.
jww

8

kullanırım

patch -p1 --merge < patchfile

Bu şekilde, çatışmalar her zamanki gibi çözülebilir.


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.