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.
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.
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.
@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.
+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.
patch
tidak sepenuhnya mendukung format ini.Jawaban:
dan
berfungsi tetapi karena banyak orang memperhatikan di komentar dan jawaban lainnya tidak mengerti tambalan, penghapusan dan penggantian nama. Tidak ada pilihan tetapi
git apply patchfile
jika Anda perlu menangani penambahan file, hapus dan ganti nama.EDIT Desember 2015
Versi terbaru dari
patch
perintah (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
patch
tidak perlu menggunakangit
untuk dapat menerapkan diff sebagai patch.sumber
git diff > patchfile
, tetapipatch -p1 < patchfile
relative
opsi seperti:git diff --no-prefix --relative=my/relative/path > patchfile
patch -p1 < patchfile
tidak memerlukan git diinstal. Perintah pertama menunjukkan perintah untuk menghasilkan diff, bukan menerapkannya.git diff from_branch > patchfile; git checkout from_branch; git patch -p1 < patchfile
ataugit diff from_branch to_branch > patchfile; ...
coba ini:
sumber
git diff
akan meletakkana/
danb/
awalan dalam output, jadipatch -p1
abaikan mereka untuk menerapkan file patch.Menggunakan
jika memungkinkan.
memiliki efek samping potensial.
git apply
juga menangani penambahan, penghapusan, dan penggantian nama file jika dijelaskan dalamgit diff
format, yangpatch
tidak akan dilakukan. Akhirnya,git apply
adalah 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.sumber
git apply
adalah cara terbaik untuk melakukannya, tetapi pertanyaan ini secara khusus menanyakan bagaimana cara menerapkan tambalan tanpa menginstal Git .--dry-run --verbose
berguna untuk menentukan apa efek sampingnya, jika ada. (menggunakan patch v2.5.8)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.saya menggunakan
Dengan cara ini, konflik dapat diselesaikan seperti biasa.
sumber
Coba ini:
sumber