Buat tambalan atau file diff dari repositori git dan terapkan ke repositori git lain

155

Saya bekerja pada proyek berbasis WordPress dan saya ingin menambal proyek saya di setiap versi rilis baru WP. Untuk ini, saya ingin membuat tambalan antara dua komit atau tag.

Misalnya, dalam repo saya, /www/WPsaya melakukan ini:

$git patch-format com1..com2 --stdout > ~/patchs/mypatch.patch

Atau

$git patch-format tag1..tag2 --stdout > ~/patchs/mypatch.patch

/www/WP git natif WordPress

/www/myproject Proyek git saya berbasis WordPress

Baris git applyperintah tidak berfungsi, saya pikir karena kita berada di repositori yang berbeda.

Bisakah saya membuat file tambalan tanpa komit, hanya diferensial dan menerapkannya ke repositori git lain?

Terima kasih sebelumnya.

zatamin
sumber

Jawaban:

243

Anda bisa menggunakan git diffuntuk menghasilkan diff terpadu yang cocok untuk git apply:

git diff tag1..tag2 > mypatch.patch

Anda kemudian dapat menerapkan tambalan yang dihasilkan dengan:

git apply mypatch.patch
Enrico Campidoglio
sumber
1
Terima kasih Enrico, saya menggunakan $git diff -u tag1..tag2 > mypatch.patchdan $git apply --stat > mypatch.patchjawabannya adalah 0 files changedsaran lain tolong? :)
zatamine
Anda perlu menentukan jalur ke file tambalan sebagai argumen git apply. Saya memperbarui jawaban saya dengan sebuah contoh.
Enrico Campidoglio
1
Saya menggunakan git diff -p tag1 tag2 > my.patchyang bekerja dengan baik.
barclay
Bagaimana cara membuat tambalan dalam format diff terpadu? sourceware.org/glibc/wiki/… mengatakan Only unified diff (-uNr) format is acceptable.tetapi ketika saya mencoba git diff -uNr tag1..tag2 > mypatch.patchsaya mendapatkan pesanusage: git diff [<options>] [<commit> [<commit>]] [--] [<path>...]
Aaron Franke
2
Hati-hati git diff ...+ git apply ...jangan menangani file yang dihapus / dipindahkan dengan benar ... saat git format-patch ...+ git am ...lakukan.
Kejadian
50

Untuk menghasilkan tambalan untuk beberapa commit, Anda harus menggunakan format-patchperintah git, mis

git format-patch -k --stdout R1..R2

Ini akan mengekspor komit Anda ke file tambalan dalam format kotak surat.

Untuk menghasilkan tambalan untuk komit terakhir, jalankan:

git format-patch -k --stdout HEAD^

Kemudian dalam repositori lain terapkan perintah patch by amgit, mis

git am -3 -k file.patch

Lihat: man git-format-patchdan git-am.

kenorb
sumber
1
Bagaimana dengan tambalan yang bisa diterapkan patch -p1? sourceware.org/glibc/wiki/…
Aaron Franke
Saya memindahkan patch dari linux ke winodws, jadi saya harus menggunakan --ignore-whitespace seperti yang disebutkan di sini stackoverflow.com/questions/13190679/…
Mahesh
2
@AaronFranke, Anda dapat mencoba opsi '-p': git format-patch -p HEAD ^ 1
Piroxiljin
Sebagai catatan, ini memiliki keuntungan menjaga pesan komit, penulis, & tanggal komit dari komitmen asli.
M. Justin
0

Sebagai pelengkap, untuk menghasilkan tambalan hanya untuk satu komit tertentu, gunakan:

git format-patch -1 <sha>

Saat file tambalan dibuat, pastikan repo Anda yang lain tahu di mana itu saat Anda menggunakannya git am ${patch-name}

Sebelum menambahkan tambalan, gunakan git apply --check ${patch-name}untuk memastikan tidak ada konflik.

Eugene
sumber