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.

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

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.


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.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.