Bu bir yama oluşturmak için iyi bir yol mu?


15

Belirli bir branştan gccresmi sürümlerle karşılaştıran bir yama oluşturmak istiyorum ; böylece tarball'ı kararlı sürümden açtığımda, yamayı uygulayabilir ve o dalda olanın eşdeğerini elde edebilirim.

İlk kez bir yama oluşturmam gerekiyor, bu yüzden bunu ilk defa yapıyorum ve asıl endişem, son derece önemli bir yazılım parçasından bahsettiğimiz için seçenekleri ve ayrıştırma işlemini doğru yapmak.

diff -crB GccStable GccGit > /tmp/fromStabletoBranch.patch

Bu yeterli ve bunu yapmanın en iyi yolu mu?


Buradaki olağan iyi uygulamalar sürüm kontrolünü veya bunların bazı varyasyonlarını içerir. Bu, mercurial, git ve ilişkili yama kuyruğu uzantılarını içerir. Yorgan da düşünebilirsiniz. Belki de ne yapmaya çalıştığınız hakkında daha fazla ayrıntıya girebilirsiniz?
Faheem Mitha

@FaheemMitha "daha fazla ayrıntı" ile ne demek istiyorsun? Ben bir sürümüne sahip gccresmi istikrarlı tar.bz2ve gelen bunun başka kararsız sürümü gitdepo, ben tabii ki sadece karşı karşılaştırmak istediğiniz ait bir yama oluşturmak istiyoruz masterşube tamamını değil deposu.
user2485710

Tamam, tamam, fark kadar basit bir şey kullanabileceğinizden emin olun. ancak sürüm kontrolünün kullanılması genellikle tercih edilir. Bir kere, yaptığınız şeyin izini kaybetmek çok daha zorlaşıyor.
Faheem Mitha

@FaheemMitha Ne önerdiğini anlamıyorum, tar.bz2 , açıkçası bir githavuz değil , nasıl devam etmem gerektiğini düşünüyorsun?
user2485710

1
"Sürüm denetimini kullanarak yamalar oluşturma" araması yapın. Yazmış olduğum önceki iki cevap unix.stackexchange.com/a/127810 ve unix.stackexchange.com/a/139817
Faheem

Yanıtlar:


20

Evet, bu bir yama oluşturmak için iyi bir yoldur.

Kısacası:

  1. Tek bir dosya için yama oluşturmak için komutunuz şöyle görünebilir

    diff -Naru file_original file_updated > file.patch

    nerede

    • -N: eksik dosyaları boş say
    • -a: tüm dosyalara metin olarak davran
    • -r: bulunan alt dizinleri özyinelemeli olarak karşılaştırma
    • -u: birleştirilmiş bağlamın NUM (varsayılan 3) satırı çıktı
  2. Tüm dizine düzeltme eki oluşturmak için:

    diff -crB dir_original dir_updated > dfile.patch

    nerede

    • -c: kopyalanmış bağlamın NUM (varsayılan 3) satırı çıktı
    • -r: alt dizinleri özyinelemeli olarak karşılaştırma
    • -B: satırları boş olan değişiklikleri yoksay

Sonuçta bu yamayı uygulamak için koşabilirsiniz

patch -p1 --dry-run < dfile.patch

Burada anahtar, pyamaya yol önekini çıkarmasını söyler, böylece dosyalar doğru şekilde tanımlanır. Çoğu durumda olması gerekir 1.

--dry-runEkranda yazdırılan sonuçtan memnunsanız kaldırın .


soru: Bir dizin veya dosya, içinde bulunanla dir_updatedkarşılaştırıldığında silinirse ne olur dir_original? Bunu da diffhalleder mi yoksa atlanır mı?
user2485710

@ user2485710 fark hangi dosyaların silindiğini görür. file.patchsadece bir metin dosyasında, böylece herhangi bir editörde veya sadece açabilirsiniz catve böyle bir çizgi göreceksinizonly in dir_original: missingfile.txt
jimmij

tamam, ama sonra patchonu silecek missingfile.txtveya başka ne olacak ?
user2485710

Değişir. Bunları kaldırmak istiyorsanız diff -N ...ilk örneğimde olduğu gibi kullanın . Normalde patchboş dosyaları varsayılan olarak kaldırır. Eğer istemiyorsanız, sadece diff -crBsorunuzda olduğu gibi kullanın . Ayrıca, bazı (nadir) durumlarda yama el kitabından sonra boş dosyaları kaldırmak için komutta -Eseçenek patchgereklidir:if the input is not a context diff or if patch is conforming to POSIX, patch does not remove empty patched files unless this option is given
jimmij 15:14

i koşuyoruz diff -Naru dir/file dir/file.new > diff.patchalma can't find file to patch at input line 3ile patch -p0 --dry-run < diff.patchyama ilk satırı okur --- dir/fileikincisi +++ dir/file.newdamgaları ile, fark için kesin dosya komut görünüyor rapor nasıl herhangi seçeneği yoktur, sadece doğru gibi görünüyor?
ptica

0

En son git checkin'i kararlı bir sürümle karşılaştırmak istiyorsanız git diff the-stable-version, depoya gitmeniz yeterlidir (depoda hangi etiketin açıkladığını, muhtemelen tam sürüm numarasını veya bazı varyantı bulmanız gerekir). gitprojenin tüm geçmişini tutar (normalde, sadece bir parçayı yakalamanın yolları vardır). the-stable-versionFarklı bir geliştirme dalında olup olmadığı önemli değildir (yani, geliştirme kesildi ve istikrarlı dalda bazı son dakika düzeltmeleri yapıldı).

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.