Bagaimana cara menerapkan tambalan `git diff` tanpa menginstal Git?

280

Bagaimana cara klien saya menerapkan tambalan yang dibuat oleh git difftanpa git diinstal? Saya telah mencoba menggunakan patchperintah tetapi selalu meminta nama file untuk ditambal.

Andrey Kuznetsov
sumber
4
Adakah yang tahu bagaimana melakukan ini jika tambalan menyertakan nama? Apakah tambalan mendukung yang asli sekarang?
Paul Crowley
3
Pertanyaannya adalah: adakah cara untuk menerapkan git diff tanpa menginstal git? Seperti disebutkan di bawah , patchtidak sepenuhnya mendukung format ini.
Aryeh Leib Taurog

Jawaban:

425
git diff > patchfile

dan

patch -p1 < patchfile

berfungsi tetapi karena banyak orang memperhatikan di komentar dan jawaban lainnya tidak mengerti tambalan, penghapusan dan penggantian nama. Tidak ada pilihan tetapi git apply patchfilejika Anda perlu menangani penambahan file, hapus dan ganti nama.


EDIT Desember 2015

Versi terbaru dari patchperintah (2.7, dirilis pada September 2012) mendukung sebagian besar fitur format "diff -git", termasuk penggantian nama dan salinan, perubahan izin, dan symlink diffs (tetapi belum binary diffs) ( pengumuman rilis ).

Jadi asalkan satu menggunakan versi saat ini / terbaru patchtidak perlu menggunakan gituntuk dapat menerapkan diff sebagai patch.

Andrey Kuznetsov
sumber
97
Atau gunakan git diff > patchfile, tetapipatch -p1 < patchfile
Jakub Narębski
11
Jika Anda ingin membuat patchfile dari subpath repositori Anda dapat menggunakan relativeopsi seperti:git diff --no-prefix --relative=my/relative/path > patchfile
Koen.
2
patch -p1 < patchfiletidak memerlukan git diinstal. Perintah pertama menunjukkan perintah untuk menghasilkan diff, bukan menerapkannya.
Andrey Kuznetsov
1
Patch yang dihasilkan adalah untuk perubahan dari cabang / refspec yang ditunjukkan dalam perintah ke cabang saat ini atau aktif. Dengan kata lain, Anda ingin git diff from_branch > patchfile; git checkout from_branch; git patch -p1 < patchfileataugit diff from_branch to_branch > patchfile; ...
hobs
1
@ PaulChechetin Seperti yang dikatakan egor83 dalam jawaban suppie, strip awal akan terpotong.
Andrey Kuznetsov
75

coba ini:

patch -p1 < patchfile
supie
sumber
4
Apa yang dilakukan argumen -p1?
chrisjlee
8
Strip memangkas di awal. Lihat man patch
egor83
16
@chrisjlee git diffakan meletakkan a/dan b/awalan dalam output, jadi patch -p1abaikan mereka untuk menerapkan file patch.
wberry
49

Menggunakan

git apply patchfile

jika memungkinkan.

patch -p1 < patchfile 

memiliki efek samping potensial.

git applyjuga menangani penambahan, penghapusan, dan penggantian nama file jika dijelaskan dalam git diffformat, yang patchtidak akan dilakukan. Akhirnya, git applyadalah model "terapkan semua atau batalkan semua" di mana segala sesuatu diterapkan atau tidak ada, sedangkan tambalan sebagian dapat menerapkan file tambalan, meninggalkan direktori kerja Anda dalam keadaan aneh.

Sola Yang
sumber
1
+1, Satu-satunya jawaban yang waras. Selain itu, diff / patch tidak akan menangani symlink, yang merupakan masalah jika (misalnya) Anda mengembalikan patch kernel Linux 3.10.
ignis
10
Ya, git applyadalah cara terbaik untuk melakukannya, tetapi pertanyaan ini secara khusus menanyakan bagaimana cara menerapkan tambalan tanpa menginstal Git .
Colin D Bennett
1
Opsi --dry-run --verboseberguna untuk menentukan apa efek sampingnya, jika ada. (menggunakan patch v2.5.8)
spyle
@ignis - " git apply patchfile -... satu-satunya jawaban yang waras ..." - itu hampir menggelikan. Setiap kali para pengembang OpenSSL mengirimi saya sebuah tambalan untuk diuji, Git gagal menerapkannya. Itu setiap saat. Saya belum melihat bahwa alat bodoh menerapkan tambalan.
jww
8

saya menggunakan

patch -p1 --merge < patchfile

Dengan cara ini, konflik dapat diselesaikan seperti biasa.

denis.peplin
sumber
-16

Coba ini:

$ git apply file.diff
Shashi
sumber
29
Lihat pertanyaan: "tanpa git terpasang"
CB Bailey