Belirli bir taahhüt için bir git yaması nasıl oluşturulur?


1231

SHA1 taahhüt numaraları listesi için yamalar oluşturur bir komut dosyası yazmak gerekir.

Kullanmayı denedim git format-patch <the SHA1>, ancak bu SHA1'den beri her taahhüt için bir yama oluşturdu. Birkaç yüz yama oluşturulduktan sonra süreci öldürmek zorunda kaldım.

Yalnızca belirli SHA1 için bir yama oluşturmanın bir yolu var mı?

Yanıtlar:


1989

Deneyin:

git format-patch -1 <sha>

veya

git format-patch -1 HEAD

Yukarıdaki dokümantasyon bağlantısına göre, -1bayrak git'e yamaya kaç taahhüt dahil edilmesi gerektiğini söyler;

- <n>

     Yamaları en üstteki taahhütlerden hazırlayın.


Düzeltme ekini şu komutla uygulayın:

git am < file.patch

210
Düzeltme ekini uygulama: git apply --stat file.patch# istatistikleri göster. git apply --check file.patch# uygulamadan önce hata olup olmadığını kontrol edin. git am < file.patch# Sonunda yamayı uygulayın.
Adrian

3
Son taahhüt başka bir şubeden birleşme ise işe yaramıyor gibi görünüyor.
Lex Li

2
Düzeltme ekini CRLF satır sonlarını kullanarak dosyalara uygulamak için:git am --keep-cr < mypatch.patch
Michael Schmeißer

40
Burada bulunan daha sonra (veya elle düzenleme) git am -3 < file.patchkullanarak çakışmaları çözmenize olanak tanıyan üç yönlü birleştirme kullanarak uygulamak için kullanın . git mergetool
Matt

6
Bu komut ayrıca taahhütten yalnızca belirli bir dosya (lar) için de çalışır: git format-patch -1 <sha> path/to/file.jsBu, yalnızca file.js için diffs içeren bir yama oluşturur
Kristóf Dombi

281

Yamaları belirli bir sha1 karmasından en üstteki taahhütlerden üretmek için:

git format-patch -<n> <SHA1>

Tek bir yama dosyasında baştan son 10 yama:

git format-patch -10 HEAD --stdout > 0001-last-10-commits.patch

2
lütfen ilk komuta örnek olacak kadar nazik olabilir misiniz
Kasun Siyambalapitiya

1
git format-patch -1 HEADson taahhüt için yama üretecek
Sriram Murali

1
Bunu sorduğum için affedersin, bu yüzden -2en son 2 taahhüt için yamalar oluşturduğunda ve açıklığa kavuşturmak için bir şey daha komutun got format-patch -2 HEADsatırı ile aynıdırgit format-patch HEAD~2
Kasun Siyambalapitiya 15:16

85

Taahhüt 1'den sonra taahhüt kimliği 2'ye sahip olduğunuzu varsayalım:

git diff 2 1 > mypatch.diff

burada 2 ve 1, SHA karmalarıdır.


Yanıtınız için teşekkür ederiz dookehster. Bu, ilgilendiğimden önce gelen taahhütleri bulmak için senaryoya ihtiyacım olduğu anlamına geliyor. Bundan kaçınabileceğimi umuyordum.
elle

11
@elle, hayır, yapmazsın git diff hash^ hash. "hash ^" daha önce verilen komutu verir. (ancak, elbette, manojlds'in cevabı daha iyidir)
J-16 SDiZ

2
git show HEAD > mypatch.diffTaahhüdeyken aynı şeyi yapmalısınız.
andho

1
@dookehester doğru mu yoksa başka bir yol mu?git diff 1 2
Kasun Siyambalapitiya

1
Bu fark ikili dosyaları dahil etmek başarısız olur.
stuckj

55

Bu komut ( @ Naftuli Tzvi Kay tarafından önerildiği gibi ):

git format-patch -1 HEAD

HEADBelirli bir karma veya aralıkla değiştirin .

UNIX posta kutusu biçimine benzeyecek şekilde biçimlendirilmiş en son işleme için düzeltme eki dosyasını oluşturur.

-<n> - Yamaları en üst sıralardan hazırlayın.

Daha sonra yama dosyasını aşağıdaki şekilde bir posta kutusu biçiminde yeniden uygulayabilirsiniz:

git am -3k 001*.patch

Bkz man git-format-patch.


Teşekkürler! Düzeltme ekinin uygulanmasının [PATCH] ile başlayan bir tamamlama mesajıyla bir taahhüt oluşturacağını belirtmek gerekir. Bunu düzeltmek kolay
Mike S

2
Olağanüstü. OP, bunu kabul etmedin, çünkü ...? @MikeS Hayır, giten azından kullanıcı doğru şekilde uygularsa, diğer biçimlendirilmiş yamalardan daha fazla yapmaz.
underscore_d

2
@MikeS Gerçekten nedenini araştırmadım, ancak -kbayrağı ( git am -3) dışarıda bırakmak bu formu bana düzeltti ( PATCH[0/10]taahhüt mesajları yok ). Git Sürüm 2.20.1.Windows.1
Jannis

30
git format-patch commit_Id~1..commit_Id  
git apply patch-file-name

Hızlı ve basit bir çözüm.


5
Ayrıca git apply --check patch-file-namebir yama uygulamadan önce aramayı unutmayın . Bu sorunların önlenmesine yardımcı olacaktır.
iamantony

16

Belirli bir taahhüdün üzerine (tek taahhüt) yamasının uygulanacağından emin olmak istiyorsanız, yeni git 2.9 (Haziran 2016) seçeneğini kullanabilirsiniz git format-patch --base

git format-patch --base=COMMIT_VALUE~ -M -C COMMIT_VALUE~..COMMIT_VALUE

# or
git format-patch --base=auto -M -C COMMIT_VALUE~..COMMIT_VALUE

# or
git config format.useAutoBase true
git format-patch -M -C COMMIT_VALUE~..COMMIT_VALUE

Bkz. Taahhüt bb52995 , taahhüt 3de6651 , taahhüt fa2ab86 , taahhüt ded2c09 (26 Nis 2016), Xiaolong Ye (``) .
(Göre Birleştirilmiş - Junio Cı Hamano gitster- içinde 72ce3ff tamamlama 2016 23 Mayıs)

format-patch: --basetemel ağaç bilgilerini kaydetmek için ' ' seçeneği ekleyin

Bakımcılar veya üçüncü taraf test kullanıcıları, yama serisinin uygulandığı tam temel ağacı bilmek isteyebilir. Git --baseağaç biçimine temel ağaç bilgilerini kaydetme ve ilk iletinin sonuna (kapak mektubu veya serideki ilk düzeltme eki) ekleme seçeneği olan ' ' seçeneğini öğretin .

Temel ağaç bilgisi, diğer herkesin çalıştığı proje geçmişinin istikrarlı kısmının bir parçası olan iyi bilinen bir taahhüt olan "temel taahhüt" ten ve iyi bilinen sıfır veya daha fazla "önkoşul düzeltme ekinden" oluşur. henüz yamalar uygulanmadan önce topolojik sırayla "temel taahhüt" üstüne uygulanması gereken "temel taahhüt" parçası olmayan yamalar uçuş.

"Temel işlem", " base-commit:" olarak ve ardından işlem nesnesi adının 40-onaltı ile gösterilir.
Bir "önkoşul düzeltme eki", " prerequisite-patch-id:" ve ardından 40-hex "düzeltme eki" olarak gösterilir; düzeltme eki " git patch-id --stable" komutundan geçirilerek elde edilebilir .


Git 2.23 (3. Çeyrek 2019) bunu geliştirecektir, çünkü " --base" seçeneği " format-patch" patch-idsönkoşul yamaları " git patch-id --stable" ile uyumlu bir şekilde hesaplanacak şekilde güncellenen istikrarsız bir şekilde hesaplamıştır .

Bkz. A8f6855 , 6f93d26 (26 Nis 2019), Stephen Boyd ( akshayka) .
(Göre Birleştirilmiş - Junio Cı Hamano gitster- içinde 8202d12 tamamlama 2019 13 Haz)

format-patch: --base patch-idçıktıyı kararlı hale getir

patch-idÜretim kodunda bir iri parça işlediğimizde içeriği yıkamıyorduk diff.c, ancak bunu ' patch-id' aracıyla "kararlı" yama-kimlikleri oluşturduğumuzda yapıyorduk .

Benzer mantığın patch-id.ciçine geçelim , diff.cböylece ' format-patch --base=' komut çağırma türleri için yama kimlikleri oluştururken aynı karmayı elde edebiliriz .


Git 2.24'ten (4. Çeyrek 2019) önce " ", düzeltilmekte olan git format-patch -o <outdir>" mkdir <outdir>" değil " mkdir -p <outdir>" eşdeğerini yaptı .

Bkz . Bert Wesarg ( ) tarafından edefc31 (11 Ekim 2019 ) . (Göre Birleştirilmiş Junio Cı Hamano - - içinde işlemek f1afbb0 , 18 Ekim 2019)bertwesarg
gitster

format-patch: çıktı dizininin önde gelen bileşenlerini oluşturma

İmzalayan: Bert Wesarg

'git format-patch -o' düzeltilen 'mkdir -p' yerine 'mkdir' ile eşdeğerdir.

adjust_shared_permGüvenlikle ilgili sonuçları olabilecek önde gelen dizinlerde ' ' kullanımından kaçının . ' config.sharedRepository' Beğen ' ' i geçici olarak devre dışı bırakarak ulaşır git init.


Git 2.25 (Q1 2020) ile, " git rebase" format.useAutoBasedüzeltilmiş yapılandırma değişkeni ayarlandığında iyi çalışmadı .

Bkz cae0bc0 işlemek , 945dc55 taahhüt , 700e006 işlemek , a749d01 işlemek , 0c47e06 taahhüt tarafından (2019 04 Ara) Denton Liu ( Denton-L) .
(Göre Birleştirilmiş - Junio Cı Hamano gitster- içinde 71a7de7 tamamlama 2019 16 Ara)

rebase: format.useAutoBasekırılmayı düzeltin

Raporlayan: Christian Biesinger
İmzalayan: Denton Liu

İle format.useAutoBase = true, rebase'i çalıştırmak bir hatayla sonuçlandı:

fatal: failed to get upstream, if you want to record base commit automatically,
please use git branch --set-upstream-to to track a remote branch.
Or you could specify base commit by --base=<base-commit-id> manually
error:
git encountered an error while preparing the patches to replay
these revisions:

ede2467cdedc63784887b587a61c36b7850ebfac..d8f581194799ae29bf5fa72a98cbae98a1198b12

As a result, git cannot rebase them.

Bu etki her zaman --no-baserebase'den format yamasına geçerek etkisinin format.useAutoBaseortadan kalkmasını sağlayın.


8

Belirli bir işlemden (son işlemden değil) yol oluşturmak için:

git format-patch -M -C COMMIT_VALUE~1..COMMIT_VALUE

4

sadece belirtilen dosyayı farklılaştırmak istiyorsanız, şunları yapabilirsiniz:

git diff master 766eceb - bağlantılar /> 000-mysql-connector.patch


0

Mercurial arka planımda kullanacaktım:

git log --patch -1 $ID > $file

Ama git format-patch -1 $IDşimdi kullanmayı düşünüyorum .


-5

Yalnızca belirli SHA1 için bir yama oluşturmanın yolu nedir?

Oldukça basit:

Seçenek 1. git show commitID > myFile.patch

Seçenek 2. git commitID~1..commitID > myFile.patch

Not: commitIDGerçek taahhüt kimliğiyle (SHA1 taahhüt kodu) değiştirin.


3
Seçenek 1 düpedüz yanlış ve soru ile ilgisi yok.
Anshuman Manral

3
Seçenek 2 de geçersiz bir komuttur. Gibi bir hata alırsınız: git a5f4bcaeb7fa7de27ae79d9522332e872889bbf0 ~ 1..a5f4bcaeb7fa7de27ae79d9522332e872889bbf0 git: 'a5f4bcaeb7fa7de27ae79d9522332e87b89b28b28b28b28b28b28b28b28b28b28b28b28b28b28b28b28b07 Bkz. 'Git --help'. Cevapları göndermeden önce lütfen kontrol edin
Anshuman Manral
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.