Bagaimana Anda mengelola perubahan kecil yang Anda ingin tetap lokal di lincah?

9

Saya sedang mempertimbangkan untuk memindahkan repositori cvs berusia 14 tahun (history intact) ke mercurial. Saya pikir saya sudah mendapatkan semua bit konversi teknis, tetapi saya masih memiliki beberapa pertanyaan tentang bekerja secara efektif di lincah.

Salah satu hal yang sering saya lihat di kotak pasir cvs pengembang perorangan (termasuk milik saya) adalah perubahan lokal yang tidak dikomit yang tidak siap untuk didorong ke jalur utama. Pemahaman saya adalah bahwa ini adalah hal yang buruk. Sebagian besar eksperimen saya dengan hg menunjukkan bahwa perubahan yang tidak dikomit adalah hal buruk untuk dimiliki. Ketidakmampuan untuk bergabung dengan mereka sudah cukup untuk itu. Jadi yang ingin saya ketahui adalah bagaimana orang lain yang menggunakan mercurial dalam coding sehari-hari menghadapinya. Bagaimana Anda menangani perubahan kode yang tidak lengkap ketika tiba saatnya memperbarui repositori Anda? Bagaimana Anda menghadapi perubahan lokal yang belum (ingin) Anda bagikan dengan pengembang lain?

nmichaels
sumber

Jawaban:

5

Saya mengatasinya dengan cara ini:

Dalam repositori lokal saya, saya melakukan setiap perubahan, bahkan jika saya sedang bereksperimen. Jika saya baik-baik saja dengan eksperimen, dan itu diuji, saya mendorongnya ke repositori jarak jauh. Jika tidak, ia tetap berada di repositori lokal saya (atau kembali ke revisi yang lebih lama).

Idenya adalah bahwa repositori jarak jauh hanya berisi versi proyek saya yang berfungsi dan telah diuji.

Oliver Weiler
sumber
3
Apakah Anda menemukan bahwa repositori jarak jauh Anda menjadi berantakan dengan jenis "fix bug in last commit" yang dikomit?
nmichaels
4

Ada beberapa hal yang akan saya tambahkan.

Salah satunya adalah menyarankan alur kerja yang membuat penggunaan rak yang bijaksana , yang dikirimkan sebagai standar dengan TortoiseHg .

Setiap kali saya ingin mengkomit bagian dari direktori kerja saya saat ini, saya akan menyimpan perubahan yang tidak ingin saya komit, mengkompilasi ulang (untuk memastikan bahwa saya tidak menyimpan bit yang sekarang mengakibatkan kompilasi yang rusak) dan kemudian menjalankan pengujian saya . Kemudian saya akan melakukan set lengkap, bekerja dan diuji. Akhirnya saya akan menjalankan dua belas untuk mengembalikan perubahan saya.

Jika saya memiliki perubahan yang lebih permanen, katakan saya ingin file konfigurasi pada mesin pengembangan saya untuk selalu menunjuk ke port localhost 3333 daripada server produksi, maka saya akan melihat ke dalam menggunakan ekstensi Mercurial Queues, yang dikirimkan dengan Mercurial dan TortoiseHg .

Mark Booth
sumber
4

Saya tidak percaya perubahan yang tidak dikomit secara intrinsik adalah hal yang buruk. Anda merujuk pada "ketidakmampuan untuk bergabung dengan mereka" - jika Anda memiliki perubahan yang tidak dikomit ke beberapa file, dan Anda menarik dan memperbarui perubahan ke file itu, Mercurial akan memulai proses penggabungan sama seperti jika Anda telah melakukan itu, kemudian meminta sebuah penggabungan. Apakah maksud Anda sesuatu yang berbeda?

Jadi, untuk perubahan lokal yang belum ingin Anda bagikan dengan pengembang lain, Anda memiliki dua pendekatan. Yang pertama adalah menjaga perubahan dalam copy pekerjaan Anda, tetapi tidak mendorongnya, dan yang lainnya adalah menyingkirkannya, dari copy pekerjaan. Yang Anda pilih tergantung pada apakah Anda ingin agar perubahan ini tersedia saat Anda bekerja.

Jika Anda menyimpannya di copy pekerjaan, perubahan yang masuk akan berfungsi dengan baik, jadi Anda hanya perlu menghindari membuat perubahan keluar, dan itu berarti menghindari melakukan itu. Jika file-file itu baru, itu mudah - jangan lakukan hg additu. Jika sudah dilacak, maka Anda dapat secara khusus mengecualikan mereka dari komit hg commit --exclude foo.txt. Jika Anda memiliki banyak file untuk dikecualikan, atau akan mengecualikannya dari banyak komit (misalnya untuk perubahan permanen ke file konfigurasi lokal), lihat ekstensi kecualikan .

Jika Anda siap untuk mengesampingkan perubahan, Anda memiliki serangkaian opsi lain. Hal yang paling sederhana adalah menggunakan hg diffpada file untuk menghasilkan tambalan yang menggambarkannya, yang Anda simpan di tempat yang aman, lalu hg patch --no-commitmenerapkan kembali tambalan itu saat Anda menginginkan perubahan kembali. Anda dapat membuat ini lebih lancar dengan memasang ekstensi rak , ekstensi loteng , atau kerabat lainnya. Anda juga bisa menggunakan ekstensi antrian , tetapi itu menggunakan palu untuk memecahkan masalah. Anda bahkan bisa melakukan perubahan, kemudian memperbarui kembali ke induk dan melakukan pekerjaan lain di sana, meninggalkan perubahan di cabang anonim yang gemuk - hg commit -m 'temporary branch' && hg up $(hg log -r 'parents(.)' --template '{node}')(walaupun mungkin lebih mudah dilakukan secara manual!). Namun, Anda harus berhati-hati untuk tidak mendorong perubahan itu.

Tom Anderson
sumber
3

Dua pendekatan dasar digunakan untuk memisahkan aliran pembangunan.

  • Cabang Bernama. Idenya adalah, Anda bekerja di cabang Anda sendiri, nmichaels_branch_of_awesome. Dengan begitu Anda dapat melakukan perubahan Anda tanpa menggoreng pekerjaan orang lain. Kemudian Anda bergabung dari orang lain ketika Anda membutuhkan pekerjaan mereka, dan ketika tiba saatnya untuk fitur, Anda mendorong ke cabang yang lebih stabil untuk integrasi. Saya mendukung cabang bernama.

  • Klon anonim. Ini membuat repositori terpisah untuk kotak pasir Anda. Di sini Anda bermain-main sampai Anda mendapatkan apa yang Anda inginkan, kemudian (mungkin) melakukan patch MQ untuk komitmen Anda dan mendorong ke tempat Anda mulai. Saya tidak menyukai pendekatan ini, karena membutuhkan manajemen direktori, dan berpotensi MQ bekerja, yang bisa rumit. Dan dengan beberapa repo, mereka dapat mulai menjadi sedikit besar untuk ini. Yang mengatakan, ini tampaknya lebih disukai oleh para Kiln devs.

Paul Nathan
sumber
Sepertinya ada seseorang yang tugasnya adalah melakukan bit integrasi. Saya tidak ingin menambahkan mq ke daftar hal-hal baru yang harus segera dipelajari orang, tetapi saya akan berpikir tentang keengganan awal saya pada gagasan cabang bernama. Mungkin tidak beralasan.
nmichaels
Untuk peluru kedua Anda mengapa tidak melakukan kloning, bekerja, dan hanya mendorong ketika Anda selesai? MQ terdengar rumit di sini
TheLQ
@TheLQ: Itu bekerja juga, tetapi tidak berbeda dengan langsung mengkloning dari repo basis. MQ akan memecah komit menjadi satu komit.
Paul Nathan