Apakah ini cara yang baik untuk membuat tambalan?

15

Saya ingin membuat tambalan dari gcccabang tertentu membandingkannya dengan rilis resmi; jadi ketika saya membongkar tarball dari rilis stabil, saya bisa menerapkan patch dan mendapatkan yang setara dengan apa yang ada di cabang tertentu.

Ini adalah pertama kalinya saya perlu membuat tambalan, jadi ini pertama kalinya saya melakukan ini dan perhatian utama saya adalah untuk mendapatkan opsi dan penguraian yang tepat karena kita berbicara tentang perangkat lunak yang sangat penting

diff -crB GccStable GccGit > /tmp/fromStabletoBranch.patch

Apakah ini cukup dan cara terbaik untuk melakukannya?

pengguna2485710
sumber
Praktik baik yang biasa di sini melibatkan kontrol versi atau varian dari ini. Ini termasuk, lincah, git, dan ekstensi antrian tambalan yang terkait. Anda juga bisa mempertimbangkan selimut. Mungkin Anda bisa menjelaskan secara lebih rinci apa yang ingin Anda lakukan?
Faheem Mitha
@FaheemMitha apa yang Anda maksud dengan "detail lebih lanjut"? Saya memiliki versi dari gccstable resmi tar.bz2dan versi tidak stabil lainnya dari gitrepositori, saya ingin membuat tambalan, tentu saja saya ingin membandingkan hanya terhadap mastercabang, bukan seluruh repositori.
user2485710
OK, well, tentu Anda bisa menggunakan sesuatu yang sederhana seperti diff. tetapi menggunakan kontrol versi umumnya lebih disukai. Untuk satu hal, itu membuat jauh lebih sulit untuk kehilangan jejak apa yang Anda lakukan.
Faheem Mitha
@FaheemMitha Saya tidak mengerti apa yang Anda sarankan, saya tar.bz2jelas bukan gitrepositori, bagaimana menurut Anda saya harus melanjutkan?
user2485710
1
Lakukan pencarian untuk "membuat tambalan menggunakan kontrol versi". Dua jawaban sebelumnya yang saya tulis yang terkait adalah unix.stackexchange.com/a/127810 dan unix.stackexchange.com/a/139817
Faheem Mitha

Jawaban:

20

Ya, ini cara yang bagus untuk membuat tambalan.

Pendeknya:

  1. Untuk membuat tambalan untuk satu file, perintah Anda mungkin terlihat seperti

    diff -Naru file_original file_updated > file.patch

    dimana

    • -N: memperlakukan file yang tidak ada sebagai kosong
    • -a: memperlakukan semua file sebagai teks
    • -r: membandingkan secara subdirektori setiap subdirektori yang ditemukan
    • -u: output NUM (default 3) baris konteks terpadu
  2. Untuk membuat tambalan untuk seluruh direktori:

    diff -crB dir_original dir_updated > dfile.patch

    dimana

    • -c: output NUM (default 3) baris konteks yang disalin
    • -r: membandingkan secara subdirektori sembarang subdirektori
    • -B: abaikan perubahan yang semua barisnya kosong

Bagaimanapun untuk menerapkan tambalan ini orang dapat menjalankan

patch -p1 --dry-run < dfile.patch

di mana switch pmenginstruksikan patch untuk menghapus awalan jalur sehingga file akan diidentifikasi dengan benar. Dalam kebanyakan kasus seharusnya 1.

Hapus --dry-runjika Anda senang dari hasil yang dicetak di layar.

jimmij
sumber
pertanyaan: apa yang seharusnya terjadi jika suatu direktori atau file terhapus dir_updateddibandingkan dengan apa yang ada di dalamnya dir_original? The diffmengurus itu juga atau akan dilewati?
user2485710
@ user2485710 diff melihat file mana yang dihapus. file.patchhanya dalam file teks, sehingga Anda dapat membukanya di editor apa pun atau hanya catitu dan Anda akan melihat garis sepertionly in dir_original: missingfile.txt
jimmij
ok, tapi kemudian patchakan menghapus itu missingfile.txtatau apa lagi?
user2485710
Tergantung. Jika Anda ingin menghapusnya gunakan diff -N ...seperti pada contoh pertama saya. Biasanya patchakan menghapus file kosong secara default. Jika Anda tidak mau, gunakan saja diff -crBseperti pada pertanyaan Anda. Juga dalam beberapa kasus (jarang) -Eopsi dalam patchperintah diperlukan untuk menghapus file kosong, setelah menambal manual:if the input is not a context diff or if patch is conforming to POSIX, patch does not remove empty patched files unless this option is given
jimmij
Saya sudah menjalankan diff -Naru dir/file dir/file.new > diff.patchmendapatkan can't find file to patch at input line 3dengan patch -p0 --dry-run < diff.patchbaris pertama tambalan membaca yang --- dir/filekedua +++ dir/file.newdengan cap waktu, diff tampaknya tepat, apakah ada opsi bagaimana melaporkan nama file yang tepat perintah mencari?
ptica