man/text
man · Metin İşleme

$ patch

Bölüm 1 · Metin İşleme

bir `diff` dosyasını orijinaline uygular

Özet

patch [-bCcEeflNnRstuv] [-B backup-prefix] [-D symbol] [-d directory] [-g vcs-option]
      [-F max-fuzz] [-i patchfile] [-o out-file] [-p strip-count] [-r rej-name] [-T | -Z]
      [-V t | nil | never | none] [-x number] [-Y prefix] [-z backup-ext]
      [--quoting-style style] [--posix] [origfile [patchfile]]
patch <patchfile

Açıklama

patch, diff(1) programı tarafından üretilen dört fark listesi biçiminden herhangi birini içeren bir yama (patch) dosyasını alacak ve bu farkları orijinal bir dosyaya uygulayarak yamalanmış bir sürüm üretecektir. Eğer patchfile (yama dosyası) belirtilmezse veya bir tire işareti ise, yama standart girdiden (standard input) okunacaktır.

patch, bir -c, -e, -n veya -u seçeneğiyle geçersiz kılınmadığı sürece, diff listesinin türünü belirlemeye çalışacaktır. Bağlam diff'leri (context diffs - eski stil, yeni stil ve birleşik (unified)) ve normal diff'ler doğrudan patch programının kendisi tarafından uygulanırken, ed diff'leri bir boru hattı (pipe) aracılığıyla doğrudan ed(1) düzenleyicisine beslenir.

Eğer yama dosyası birden fazla yama içeriyorsa, patch bunların her birini ayrı yama dosyalarından geliyormuş gibi uygulamaya çalışacaktır. Bu durum, diğer şeylerin yanı sıra, yamalanacak dosyanın adının her bir diff listesi için ayrı ayrı belirlenmesi gerektiğinin varsayıldığı ve her bir diff listesinden önceki gereksiz verilerin (garbage) dosya adları ile revizyon seviyesi gibi ilginç bilgiler için inceleneceği anlamına gelir (aşağıdaki Dosya Adı Belirleme bölümüne bakın).

Seçenekler

  • -B backup-prefix, --prefix backup-prefix: Bir sonraki argümanın yedek dosya adına bir ön ek (prefix) olarak yorumlanmasını sağlar. Eğer bu argüman belirtilirse, -z seçeneğine verilen tüm argümanlar yoksayılacaktır.

  • -b, --backup: Değiştirilmeden önce dosyanın yedek bir kopyasını kaydeder. Varsayılan olarak, dosyanın zaten numaralandırılmış bir yedeği olmadığı sürece orijinal dosya .orig yedek uzantısıyla kaydedilir; numaralandırılmış yedek varsa numaralandırılmış bir yedek oluşturulur. Bu, -V existing seçeneğini belirtmekle eşdeğerdir.

  • --backup-if-mismatch: Değiştirilmeden önce dosyanın yedek bir kopyasını kaydeder, ancak yalnızca bir uyuşmazlıkla karşılaşıldığında. Özellikle, bir yığın (hunk) uygulanamazsa veya bir ya da daha fazla yığını uygulamak için belirsizlik (fuzz) gerekirse bu seçenek bir yedek dosyası oluşturacaktır. -b seçeneğinde olduğu gibi, --backup-if-mismatch de bir yedek oluşturulacağı zaman -V seçeneği tarafından kabul edilen mevcut formatı kullanır.

    Yedeklemeler zaten -b seçeneğiyle talep edilmişse, bu seçeneğin hiçbir etkisi yoktur.

    Bu seçenek, --posix belirtilmediği sürece şu anda varsayılandır.

  • --no-backup-if-mismatch: Bu seçenek --backup-if-mismatch seçeneğini geçersiz kılar ve yedeklemeler --posix veya -V none ile devre dışı bırakılmadığı sürece her dosya için yedek oluşturur.

  • -C, --check, --dry-run: Yamanın sorunsuz bir şekilde uygulanıp uygulanamayacağını kontrol eder ancak hiçbir şeyi değiştirmez.

  • -c, --context: patch'i, yama dosyasını bir bağlam diff'i (context diff) olarak yorumlamaya zorlar.

  • -D symbol, --ifdef symbol: patch'in değişiklikleri işaretlemek için #ifdef...#endif yapısını kullanmasını sağlar. Takip eden argüman, ayırt edici sembol olarak kullanılacaktır. C derleyicisinin aksine, -D ile argüman arasında bir boşluk olması gerektiğine dikkat edin.

  • -d directory, --directory directory: patch'in bir sonraki argümanı bir dizin olarak yorumlamasını ve başka bir şey yapmadan önce çalışma dizinini bu dizinle değiştirmesini sağlar.

  • -E, --remove-empty-files: Yamalar uygulandıktan sonra boş kalan çıktı dosyalarının patch tarafından silinmesini sağlar. Bu seçenek, dosya oluşturan veya silen yamalar uygulanırken kullanışlıdır.

  • -e, --ed: patch'i, yama dosyasını bir ed(1) betiği olarak yorumlamaya zorlar.

  • -F max-fuzz, --fuzz max-fuzz: Maksimum belirsizlik (fuzz) faktörünü ayarlar. Bu seçenek yalnızca bağlam diff'leri (context diffs) için geçerlidir ve bir yığını (hunk) yerleştirecek yerler aranırken patch'in bu sayıya kadar satırı yoksaymasını sağlar. Daha büyük bir belirsizlik faktörünün hatalı bir yama olasılığını artırdığına dikkat edilmelidir. Varsayılan belirsizlik faktörü 2'dir ve bağlam diff'indeki bağlam satırı sayısından (normalde 3) daha fazlasına ayarlanamaz.

  • -f, --force: patch'i, kullanıcının tam olarak ne yaptığını bildiğini varsaymaya ve hiçbir soru sormamaya zorlar. Şunları varsayar: yamalanacak dosyanın bulunamadığı yamaları atla; yamadaki Prereq: satırı için yanlış sürüme sahip olsalar bile dosyaları yamala; ve öyle görünseler bile yamaların tersine çevrilmediğini varsay. Bu seçenek açıklamaları (commentary) engellemez; bunun için -s seçeneğini kullanın.

  • -g vcs-option, --get vcs-option: patch'in eksik veya salt okunur dosyalar için bazı sürüm kontrol sistemlerine danışmasını sağlar. patch'in bu sürümü SCCS ve ClearCase için sınırlı, yalnızca algılamaya yönelik desteğe sahipken, RCS ve Perforce için tam desteğe sahiptir.

    Eğer vcs-option değeri 0 olarak ayarlanırsa, patch hiçbir sürüm kontrol sistemine danışmaz. PATCH_GET ortam değişkeni ayarlanarak geçersiz kılınmadığı sürece varsayılan davranış budur.

    Eğer vcs-option değeri negatif bir sayıya ayarlanırsa, patch, desteklenen bir sürüm kontrol sistemi altında algılanan her bir dosyanın kullanıma alınmasını (checkout) onaylamak için kullanıcıya soracaktır.

    Eğer vcs-option değeri pozitif bir sayıya ayarlanırsa, patch, desteklenen bir sürüm kontrol sistemi altında algılanan her bir dosyayı kullanıma almadan (checkout) önce kullanıcıya sormayacaktır.

    patch bir Perforce çalışma alanında (workspace) çalışmadığı sürece, --get seçeneğinin çalışabilmesi için deponun (repository) kök dizininde olunması gerektiğine dikkat edin.

    --get seçeneği bir dosya adının nasıl seçileceğini de etkileyebilir. Ayrıntılar için aşağıdaki Dosya Adı Belirleme bölümüne bakın.

  • --help: Bir yardım mesajı yazdırır ve çıkış yapar.

  • -i patchfile, --input patchfile: Bir sonraki argümanın girdi dosya adı (yani bir yama dosyası - patchfile) olarak yorumlanmasını sağlar. Bu seçenek birden fazla kez belirtilebilir.

  • -l, --ignore-whitespace: Girdi dosyanızdaki sekmelerin (tab) ve boşlukların bozulmuş olması ihtimaline karşı desen eşleştirmenin esnek bir şekilde yapılmasını sağlar. Desen satırındaki herhangi bir boşluk dizisi, girdi dosyasındaki herhangi bir boşluk dizisiyle eşleşecektir. Normal karakterlerin yine de tam olarak eşleşmesi gerekir. Bağlamın her bir satırı, girdi dosyasındaki bir satırla yine de eşleşmelidir.

  • -N, --forward: patch'in tersine çevrildiğini veya zaten uygulandığını düşündüğü yamaları yoksaymasını sağlar. Ayrıca -R seçeneğine bakın.

  • -n, --normal: patch'i, yama dosyasını normal bir diff olarak yorumlamaya zorlar.

  • -o out-file, --output out-file: Bir sonraki argümanın çıktı dosya adı olarak yorumlanmasını sağlar.

  • -p strip-count, --strip strip-count: Dosyalarınızı yamayı gönderen kişiden farklı bir dizinde tutmanız durumunda, yama dosyasında bulunan yol adlarının (pathname) nasıl ele alınacağını kontrol eden yol adı ayıklama sayısını (strip count) ayarlar. Ayıklama sayısı, yol adının önünden kaç tane eğik çizginin (slash) ayıklanacağını belirtir. Aradaki dizin adları da kaybolur. Örneğin, yama dosyasındaki dosya adının /u/howard/src/blurfl/blurfl.c olduğunu varsayalım:

    • -p0: tüm yol adını değiştirilmeden verir.

    • -p1: başındaki eğik çizgi olmadan şu yolu verir:

      u/howard/src/blurfl/blurfl.c
    • -p4: şu yolu verir:

      blurfl/blurfl.c

    -p seçeneğini hiç belirtmemek, önündeki yolda bulunan tüm dizinler (u/howard/src/blurfl) mevcut olmadığı ve bu yol göreceli (relative) olmadığı sürece size doğrudan blurfl.c dosyasını verir; bu durumda tüm yol adını değiştirilmeden alırsınız. Sonuçta elde ettiğiniz dosya ya mevcut dizinde ya da -d seçeneğiyle belirtilen dizinde aranır.

  • --quoting-style style: patch'in dosya adlarını konsola nasıl yazacağını kontrol eder. style için geçerli değerler şunlardır:

    • literal: Dosya adlarını özel bir tırnak içine almadan yazar.
    • shell: Dosya adlarını, kabuk meta karakterleri (shell metacharacters) veya boşluklar gibi sorun oluşturabilecek diğer karakterleri içeriyorlarsa tırnak içine alır.
    • shell-always: Dosya adlarını, her zaman kabuk meta karakterleri veya diğer sorunlu karakterleri içeriyorlarsa tırnak içine alır.
    • c: Dosya adlarını bir C stili dizeymiş (string) gibi tırnak içine alır.
    • escape: Çift tırnakların atlanması dışında c ile aynı işlemi yapar.

    QUOTING_STYLE ayarlanmadığı sürece varsayılan tırnak içine alma seçeneği shell'dir.

  • -R, --reverse: patch'e bu yamanın eski ve yeni dosyaların yerleri değiştirilerek oluşturulduğunu söyler. (Evet, insan doğası gereği bunun ara sıra gerçekleştiğini söylemekten korkuyorum.) patch, her bir yığını (hunk) uygulamadan önce tersine çevirmeye çalışacaktır. Reddedilenler (rejects) yer değiştirmiş biçimde çıktı olarak verilecektir. -R seçeneği ed diff betikleriyle çalışmaz çünkü ters işlemi yeniden oluşturmak için çok az bilgi vardır.

    Eğer bir yamanın ilk yığını (hunk) başarısız olursa, patch bu yığını o şekilde uygulanıp uygulanamayacağını görmek için tersine çevirecektir. Eğer uygulanabiliyorsa, size -R seçeneğinin ayarlanmasını isteyip istemediğiniz sorulacaktır. Uygulanamıyorsa, yama normal şekilde uygulanmaya devam edecektir. Not: Bu yöntem, normal bir diff ise ve ilk komut bir ekleme (append) ise (yani aslında bir silme (delete) olması gerekiyorduysa), boş bir bağlamın her yerle eşleşmesi nedeniyle eklemeler her zaman başarılı olacağından tersine çevrilmiş bir yamayı tespit edemez. Neyse ki çoğu yama satırları silmek yerine ekler veya değiştirir, bu nedenle tersine çevrilmiş çoğu normal diff başarısız olacak bir silme işlemiyle başlayacak ve bu da sezgisel yöntemi (heuristic) tetikleyecektir.

  • -r rej-name, --reject-file rej-name: Bir sonraki argümanın reddetme dosya adı (reject file name) olarak yorumlanmasını sağlar.

  • -s, --quiet, --silent: Bir hata oluşmadığı sürece patch'in işini sessizce yapmasını sağlar.

  • -T, --set-time: patch'e, çıktı dosyasının erişim ve değiştirme sürelerini diff başlığında yer alan zaman damgalarına göre ayarlamasını söyler. -T seçeneği, zaman damgasında bir saat dilimi kayması (timezone offset) bulunmadığı sürece, patch'i sağlanan zaman damgalarının sistemin yerel saat diliminde olduğunu varsaymaya zorlayacaktır.

    Orijinal dosyanın zaman damgası diff başlığındaki uygun dosyanın zaman damgasıyla eşleşmediği ve yama bağlamı orijinal dosyayla belirsizlik (fuzz) veya kayma (offset) olmadan eşleşmediği sürece patch, çıktı dosyasındaki süreleri değiştirmeyecektir. Eğer -f bayrağı belirtilmişse, bu uyarıların her ikisi de yoksayılır.

  • -t, --batch: Soruları engellemesi bakımından -f seçeneğine benzer, ancak bazı farklı varsayımlarda bulunur: yamalanacak bir dosyanın bulunamadığı yamaları atlar (-f ile aynı); dosyanın yamadaki Prereq: satırı için yanlış sürüme sahip olduğu yamaları atlar; ve öyle görünüyorlarsa yamaların tersine çevrilildiğini varsayar.

  • -u, --unified: patch'i, yama dosyasını birleşik bir bağlam diff'i (unified context diff - unidiff) olarak yorumlamaya zorlar.

  • -V t | nil | never | none, --version-control t | nil | never | none: Bir sonraki argümanın yedek dosya adları oluşturmak için bir yöntem olarak yorumlanmasını sağlar. Yapılan yedeklemelerin türü, bu seçenek tarafından geçersiz kılınan PATCH_VERSION_CONTROL veya VERSION_CONTROL ortam değişkenlerinde de verilebilir. -B seçeneği bu seçeneği geçersiz kılar ve yedek dosya adları oluşturmak için her zaman ön ekin kullanılmasını sağlar. PATCH_VERSION_CONTROL ve VERSION_CONTROL ortam değişkenlerinin değerleri ile -V seçeneğine verilen argüman, GNU Emacs version-control değişkenine benzer; ayrıca daha açıklayıcı olan eş anlamlı kelimeleri de tanırlar. Geçerli değerler şunlardır (benzersiz kısaltmalar kabul edilir):

    • t, numbered: Her zaman numaralandırılmış yedekler oluşturur.
    • nil, existing: Zaten numaralandırılmış yedeği olan dosyaların numaralandırılmış yedeklerini, diğerlerinin ise basit yedeklerini oluşturur.
    • never, simple: Her zaman basit yedekler oluşturur.
    • none: Yedek oluşturmaz.
  • -v, --version: patch'in revizyon başlığını ve yama seviyesini (patch level) yazdırmasını sağlar.

  • -x number, --debug number: Dahili hata ayıklama (debugging) bayraklarını ayarlar ve yalnızca patch geliştiricilerini (patch patchers) ilgilendirir.

  • -Y prefix, --basename-prefix prefix: Yedeklenecek dosyanın temel adına (basename) ön ek (prefix) ekler. Örneğin, bir /u/howard/src/blurfl/blurfl.c dosyasını yamalarken -Y 0_ belirtilmesi, yedeği /u/howard/src/blurfl/0_blurfl.c.orig konumunda oluşturacaktır.

  • -Z, --set-utc: patch'e, çıktı dosyasının erişim ve değiştirme sürelerini diff başlığında yer alan zaman damgalarına göre ayarlamasını söyler. -Z seçeneği, zaman damgasında saat dilimi kayması bulunmadığı sürece, patch'i sağlanan zaman damgalarının UTC biçiminde olduğunu varsaymaya zorlayacaktır. -T seçeneğinde çıktı dosyasının değiştirme süresinin ne zaman değiştirileceğine ilişkin açıklanan uyarıların -Z seçeneği için de geçerli olduğunu unutmayın.

  • -z backup-ext, --suffix backup-ext: Bir sonraki argümanın .orig yerine kullanılacak yedek uzantısı (backup extension) olarak yorumlanmasını sağlar.

  • --posix: Sıkı IEEE Std 1003.1-2008 ("POSIX.1") uyumluluğunu etkinleştirir, özellikle:

    1. -b seçeneği belirtilmediği sürece yedek dosyaları oluşturulmaz.
    2. Belirtilmemişse, kullanılan dosya adı; eski, yeni ve indeks (index) dosyalarından mevcut olan ilkidir.

Yama Uygulaması

patch, baştaki tüm gereksiz verileri (garbage) atlamaya, diff'i uygulamaya ve ardından sondaki gereksiz verileri atlamaya çalışacaktır. Böylece, bir diff listesi içeren bir makaleyi veya mesajı patch'e besleyebilirsiniz ve bu çalışacaktır. Eğer diff'in tamamı tutarlı bir miktarda girintilenmişse, bu durum dikkate alınacaktır.

Bağlam diff'lerinde ve daha az derecede olmak üzere normal diff'lerde, patch yamada belirtilen satır numaralarının yanlış olduğunu algılayabilir ve yamanın her bir yığınını (hunk) uygulamak için doğru yeri bulmaya çalışır. İlk tahmin olarak, yığın için belirtilen satır numarasını alır ve önceki yığını uygularken kullanılan kayma (offset) miktarını ekler veya çıkarır. Eğer orası doğru yer değilse, patch, yığında verilen bağlamla eşleşen bir dizi satır için hem ileriye hem de geriye doğru tarama yapacaktır. patch ilk olarak bağlamın tüm satırlarının eşleştiği bir yer arar. Eğer böyle bir yer bulunamazsa ve bu bir bağlam diff'i ise ve maksimum belirsizlik (fuzz) faktörü 1 veya daha fazlasına ayarlanmışsa, bağlamın ilk ve son satırı yoksayılarak başka bir tarama yapılır. Bu da başarısız olursa ve maksimum belirsizlik faktörü 2 veya daha fazlasına ayarlanmışsa, bağlamın ilk iki ve son iki satırı yoksayılır ve başka bir tarama daha yapılır. (Varsayılan maksimum belirsizlik faktörü 2'dir).

Eğer patch, yamanın o yığınını yerleştirecek bir yer bulamazsa, yığını normalde çıktı dosyasının adına ".rej" eklenerek oluşturulan bir reddetme (reject) dosyasına yazacaktır. (Girdi yaması ister bir bağlam diff'i ister normal bir diff olsun, reddedilen yığının bağlam diff formatında çıkacağını unutmayın. Eğer girdi normal bir diff ise, bağlamların birçoğu sadece boş olacaktır.) Reddetme dosyasındaki yığınların satır numaraları yama dosyasındakilerden farklı olabilir: Bunlar, başarısız olan yığınların eski dosya yerine yeni dosyada ait olduğunu patch'in düşündüğü yaklaşık konumu yansıtır.

Her bir yığın tamamlandığında, yığının başarılı mı yoksa başarısız mı olduğu ve patch'in yığının (yeni dosyada) hangi satıra gitmesi gerektiğini düşündüğü size bildirilecektir. Eğer bu, diff'te belirtilen satır numarasından farklıysa, size kayma (offset) miktarı bildirilecektir. Tek bir büyük kayma miktarı, bir yığının yanlış yere kurulduğunun bir göstergesi OLABİLİR. Eşleşmeyi sağlamak için bir belirsizlik (fuzz) faktörü kullanılıp kullanılmadığı da size bildirilecektir; bu durumda da biraz şüpheci olmalısınız.

Dosya Adı Belirleme

Komut satırında herhangi bir orijinal dosya belirtilmemişse, patch, düzenlenecek dosyanın adının ne olduğunu baştaki gereksiz verilerden (garbage) anlamaya çalışacaktır. Olası bir dosya adı kontrol edilirken, yol adı bileşenleri -p seçeneğiyle belirtildiği şekilde ayıklanır ve dosyanın varlığı ile yazılabilirliği geçerli çalışma dizinine (veya -d seçeneğiyle belirtilen dizine) göre kontrol edilir.

Eğer diff bir bağlam veya birleşik (unified) diff ise, patch eski ve yeni dosya adlarını diff başlığından belirleyebilir. Bağlam diff'leri için, “eski” dosya "***" ile başlayan satırda, “yeni” dosya ise "---" ile başlayan satırda belirtilir. Birleşik bir diff için, “eski” dosya "---" ile başlayan satırda, “yeni” dosya ise "+++" ile başlayan satırda belirtilir. Baştaki gereksiz verilerde (diff türüne bakılmaksızın) bir "Index:" satırı varsa, patch o satırdaki dosya adını “indeks” (index) dosyası olarak kullanacaktır.

patch, dosya adını aşağıdaki adımları uygulayarak seçecektir ve ilk eşleşme kullanılacaktır:

  1. Eğer patch sıkı IEEE Std 1003.1-2008 (“POSIX.1”) modunda çalışıyorsa, mevcut olan “eski”, “yeni” ve “indeks” dosya adlarından ilki kullanılır.

  2. Eğer patch sıkı IEEE Std 1003.1-2008 (“POSIX.1”) modunda çalışmıyorsa ve sıfır olmayan bir --get argümanı sağlanmışsa, patch bir sürüm kontrol sistemi altında var olduğu tespit edilen “indeks”, “eski” veya “yeni” dosya adlarından birini seçecektir. Aksi takdirde patch, ya “eski” ve “yeni” dosya adlarını ya da bağlam dışı (non-context) bir diff için “indeks” dosya adını inceleyecek ve en az yol bileşenine, en kısa temel ada (basename) ve en kısa toplam dosya adı uzunluğuna sahip dosya adını (bu sırayla) seçecektir.

  3. Yamalanacak uygun bir dosya bulunamadıysa, yama dosyası bir bağlam veya birleşik diff ise ve eski dosya sıfır uzunluktaysa, yeni dosya adı oluşturulur ve kullanılır.

  4. Dosya adı hala belirlenemiyorsa, patch kullanıcıya kullanılacak dosya adını soracaktır.

Ek olarak, baştaki gereksiz veriler bir "Prereq: " satırı içeriyorsa, patch gereksinimler satırındaki ilk kelimeyi (normalde bir sürüm numarası) alacak ve bu kelimenin bulunup bulunamadığını görmek için girdi dosyasını kontrol edecektir. Bulunamazsa, patch devam etmeden önce onay isteyecektir.

Tüm bunların neticesi, bir haber arayüzündeyken (news interface) aşağıdakileri söyleyebilmeniz gerektiğidir:

| patch -d /usr/src/local/blurfl

ve yama içeren makaleden doğrudan blurfl dizinindeki bir dosyayı yamalayabilmenizdir.

Yedek Dosyaları

Varsayılan olarak, yamalanmış sürüm orijinalinin yerine yerleştirilir ve orijinal dosya, aynı adla ".orig" uzantısıyla veya -B, -V ya da -z seçenekleriyle belirtildiği şekilde yedeklenir. Yedek dosyaları oluşturmak için kullanılan uzantı, yukarıdaki seçenekler tarafından geçersiz kılınan SIMPLE_BACKUP_SUFFIX ortam değişkeninde de belirtilebilir.

Eğer yedek dosyası orijinal dosyaya bir sembolik veya sabit bağlantı (hard link) ise, patch, dosya adının son bileşenindeki ilk küçük harfi büyük harfe dönüştürerek yeni bir yedek dosya adı oluşturur. Adında başka küçük harf kalmamışsa, adın ilk karakterini siler. Zaten var olmayan veya orijinal dosyaya bağlı olmayan bir yedek dosyası bulana kadar bu işlemi tekrarlar.

Çıktının nereye gitmesini istediğinizi -o seçeneğiyle de belirtebilirsiniz; eğer o dosya zaten mevcutsa, önce yedeklenir.

Yama Gönderenler İçin Notlar

Yamalar gönderecekseniz aklınızda bulundurmanız gereken birkaç şey vardır:

İlk olarak, gönderdiğiniz yama dosyasındaki ilk diff olarak yama seviyesini (patch level) artırmak üzere yamalanan bir patchlevel.h dosyası tutarak insanları büyük bir zahmetten kurtarabilirsiniz. Yamanın içine bir "Prereq": satırı koyarsanız, yama programı bir uyarı vermeden yamaları sırasız uygulamalarına izin vermeyecektir.

İkinci olarak, dosya adlarını bir bağlam diff başlığında veya bir "Index:" satırıyla doğru belirttiğinizden emin olun. Bir alt dizindeki bir şeyi yamalıyorsanız, yama kullanıcısına gerektiğinde bir -p seçeneği belirtmesini söylediğinizden emin olun.

Üçüncü olarak, boş bir dosyayı oluşturmak istediğiniz dosyayla karşılaştıran bir diff göndererek yeni bir dosya oluşturabilirsiniz. Eğer oluşturmak istediğiniz dosya, diff uygulandığında hedef dizinde zaten mevcutsa, patch yamayı potansiyel olarak tersine çevrilmiş olarak tanımlayacak ve yamayı tersine çevirmeyi teklif edecektir.

Dördüncü olarak, insanların yamayı zaten uygulayıp uygulamadıklarını merak etmelerine neden olacağından, tersine çevrilmiş yamalar göndermemeye dikkat edin.

Beşinci olarak, tek bir dosyaya 582 diff listesi koyarak işin içinden sıyrılabilmeniz mümkün olsa da, bir şeylerin ters gitmesi ihtimaline karşı ilgili yamaları ayrı dosyalarda gruplamak muhtevanasında muhtemelen daha akıllıca olacaktır.

Ortam Değişkenleri

  • PATCH_GET: Varsayılan sürüm kontrolü davranışını belirtir. Geçerli değerler için --get seçeneğinin açıklamasına bakın.
  • PATCH_VERBOSE: patch'in varsayılan ayrıntı düzeyini (verbosity) belirtir. PATCH_VERBOSE değerini sıfır olmayan bir tam sayıya ayarlamak ayrıntı düzeyini etkinleştirecektir.
  • POSIXLY_CORRECT: Ayarlandığında, patch sanki --posix seçeneği belirtilmiş gibi davranır.
  • QUOTING_STYLE: Varsayılan tırnak içine alma stilini belirtir. Geçerli değerler için --quoting-style seçeneğinin açıklamasına bakın.
  • SIMPLE_BACKUP_SUFFIX: Yedek dosya adları için ".orig" yerine kullanılacak uzantı.
  • TMPDIR: Geçici dosyaların yerleştirileceği dizin; varsayılan /tmp'tir.
  • PATCH_VERSION_CONTROL: Numaralandırılmış yedek dosyalarının ne zaman oluşturulacağını seçer.
  • VERSION_CONTROL: PATCH_VERSION_CONTROL ile aynıdır.

Dosyalar

  • $TMPDIR/patch*: patch geçici dosyaları.
  • /dev/tty: kullanıcıya sorduğunda girdiyi okumak için kullanılır.

Çıkış Durumu

patch aracı aşağıdaki değerlerden biriyle çıkış yapar:

  • 0: Başarılı tamamlanma.
  • 1: Bir veya daha fazla satır bir reddetme (reject) dosyasına yazıldı.
  • >1: Bir hata oluştu.

Bir dizi yamayı bir döngü içinde uygularken, kısmen yamalanmış bir dosyaya daha sonraki bir yamayı uygulamamak için bu çıkış durumunu kontrol etmek sizin yararınızadır.

Hata Teşhisleri

Burada listelenemeyecek kadar çoktur, ancak genellikle patch'in yama dosyanızı ayrıştıramadığını (parse) gösterir.

"Hmm..." mesajı, yama dosyasında işlenmemiş metin olduğunu ve patch'in bu metinde bir yama olup olmadığını ve eğer varsa bunun ne tür bir yama olduğunu sezmeye çalıştığını gösterir.

Ayrıca Bakınız

diff(1)

Standartlar

patch aracı, --posix seçeneği için yukarıda ayrıntıları verilen durumlar hariç, IEEE Std 1003.1-2008 ("POSIX.1") belirtimiyle uyumludur.

[-BCEFfstVvxz] ve [--posix] bayrakları bu belirtimin uzantılarıdır.

Yazarlar

Larry Wall ve diğer birçok katkıda bulunan kişi.

Uyarılması Gereken Durumlar

patch, bir ed betiğinde satır numaralarının kayık olup olmadığını anlayamaz ve normal bir diff'teki hatalı satır numaralarını yalnızca bir "change" (değiştir) veya "delete" (sil) komutu bulduğunda tespit edebilir. Belirsizlik (fuzz) faktörü 3 kullanan bir bağlam diff'i de aynı soruna sahip olabilir. Uygun bir etkileşimli arayüz eklenene kadar, değişikliklerin anlamlı olup olmadığını görmek için bu durumlarda muhtemelen bir bağlam diff'i yapmalısınız. Tabii ki, hatasız derleme yamanın çalıştığının oldukça iyi bir göstergesidir, ancak her zaman değil.

patch, çok fazla tahmin yürütmek zorunda kaldığında bile genellikle doğru sonuçlar üretir. Ancak sonuçların doğruluğu, yalnızca yama, üretildiği dosyanın birebir aynı sürümüne uygulandığında garanti edilir.

Hatalar

Kısmi eşleşmeler, aşırı sapan kaymalar (offsets) ve yer değiştirmiş kodlar konusunda daha akıllı olabilirdi, ancak bu fazladan bir geçiş (pass) gerektirirdi.

Birbiri üzerine inşa edilen birkaç yamayı art arda kontrol etmeye çalışırsanız, yama kontrol modu (-C) başarısız olacaktır. Bu durumun üstesinden gelebilmek için geçici dosyaları muhafaza edecek şekilde tüm yama kodunun yeniden yapılandırılması gerekir.

Eğer kod çoğaltılmışsa (örneğin #ifdef OLDCODE ... #else ... #endif ile), patch her iki sürümü de yamalamaktan acizdir ve eğer çalışırsa, muhtemelen yanlış olanı yamalayacak ve üstelik başarılı olduğunu söyleyecektir.

Zaten uygulamış olduğunuz bir yamayı tekrar uygularsanız, patch bunun tersine çevrilmiş bir yama olduğunu düşünecek ve yamayı geri almayı (un-apply) teklif edecektir. Bu bir özellik olarak da yorumlanabilir.