Berikut adalah beberapa contoh kode sementara / lokal. Diperlukan untuk bekerja dengan basis kode, tetapi akan berbahaya untuk menjadi bagian darinya:
- File proyek. Jalur mungkin perlu diedit untuk mencerminkan tata letak pada PC saat ini.
- Makefiles. Misalnya optimasi mungkin perlu dimatikan saat debugging, tetapi tidak untuk server CI.
- Retas buruk kotor. Misalnya
return 7
di tengah fungsi, untuk menguji sesuatu, tergantung pada fungsinya, dan dicurigai rusak pada nilai 7. Atau 7 adalah kode tombol yang belum diimplementasikan, yang saya implementasikan dan perlu uji di seluruh kehidupan cabang saya.
Saya telah mencoba menjaga mereka dalam komit git bahwa saya selalu rebase ke atas sebelum mendorong ke repo dan kemudian mendorong HEAD~
. Ini cukup merepotkan dan tidak bekerja dengan svn. Stashing membuatku lebih takut - "apakah aku ingat untuk meletus setelah mendorong ??".
Menjaga kode di luar kontrol versi menimbulkan kebisingan yang tidak menyenangkan setiap kali komit sedang dirakit dan mungkin secara tidak sengaja dimasukkan ke dalam komit pada malam Jumat.
Apa yang akan menjadi solusi waras untuk kode membuang seperti itu?
version-control
Vorac
sumber
sumber
return 7
ditrunk
Jumat malam, setelah penggabungan yang buruk di musim panas.Return 7
.. kalau saja mereka semua begitu jelas!Jawaban:
Semua kode bersifat sementara. Ketika saya membuat perubahan, saya akan memperkenalkan placeholder sesekali - ikon yang saya gambar menunggu yang asli dari perancang, fungsi yang saya tahu akan memanggil perpustakaan yang ditulis rekan saya dan belum selesai (atau mulai), logging ekstra yang akan dihapus atau jika tidak, kondisikan bug yang akan saya perbaiki setelah mereka diketahui oleh tim pengujian, dll.
Jadi, periksa semuanya. Gunakan cabang fitur untuk semua pengembangan Anda, maka Anda dapat menggabungkan versi final menjadi trunk dan tidak ada yang perlu tahu peretasan dan kerangka dan perbaikan apa yang Anda buat selama siklus pengembangan Anda, mereka hanya perlu lihat versi final. Tetapi jika Anda sudah berkomitmen pada cabang Anda secara teratur, Anda akan dapat melihat hal-hal yang layak dijaga jika sehari berjalan dengan salah, atau Anda melanjutkan pengkodean setelah makan siang di pub.
Kontrol versi bukan repositori artifak atau sistem penyimpanan dokumen. Ini tentang memegang sejarah perubahan. Simpan semua yang Anda suka di sana karena suatu hari Anda mungkin ingin melihat apa itu, dan itulah hari-hari Anda menyadari apa sebenarnya SCM Anda.
PS. File yang benar-benar sementara (mis. .Jj atau membangun artefak) tidak memiliki tempat di SCM Anda. Ini adalah hal-hal yang tidak memiliki nilai bagi siapa pun. Anda dapat mengetahui siapa mereka - jika Anda menghapusnya, Anda tidak keberatan, atau bahkan tahu mereka hilang.
sumber
Untuk file proyek, strategi terbaik adalah ketika Anda dapat menghasilkan file proyek melalui skrip. Tambahkan file proyek aktual ke abaikan Anda, dan cukup buat ulang file proyek sesuai keperluan. Misalnya, dalam proyek Java, saya menggunakan gradle yang dapat menghasilkan proyek gerhana.
Anda harus dapat beralih antara mode pengoptimalan dan debug tanpa mengubah Makefile Anda. Sebagai gantinya, gunakan flag baris perintah, variabel lingkungan, atau file terpisah yang tidak ada dalam repositori Anda untuk mengontrolnya.
Tidak bisakah Anda menulis tes yang menginduksi kasus kegagalan yang diduga?
Untuk sebagian besar kasus, Anda harus dapat menyesuaikan alur kerja Anda sehingga Anda tidak membuat perubahan ini ke file di repositori Anda. File-file yang diubah secara lokal harus ditambahkan ke mekanisme abaikan proyek Anda dan tidak berada di repositori. Dalam beberapa kasus, Anda masih akan membuat perubahan sementara yang tidak ingin Anda masukkan ke dalam repositori. Untuk itu, tambahkan urutan khusus seperti: XXX, dan tambahkan kait pra-komit yang menolak komit yang masih memilikinya di sana.
sumber
svn
tidak mendukung komitmen sebagian file, jadi menyusahkan dalam situasi tersebut. Sebagian besar kolega saya baru saja melakukan peretasan ke cabang dan membersihkannya saat bergabungtrunk
. Namun, saya terganggu (dan membuat kesalahan selama penggabungan, dan penggabungan dalam svn adalah suci dan tidak berubah) lebih mudah dan karenanya pertanyaan ini.Kontrol versi harus berisi kode dan konfigurasi yang diperlukan untuk membangun aplikasi.
Ini berarti:
Barang sementara yang diperkenalkan dalam waktu singkat (waktu yang dibutuhkan untuk menentukan lokasi bug, atau untuk bereksperimen dengan fitur bahasa, misalnya) tidak boleh dalam kontrol versi: simpanlah hingga Anda membutuhkannya itu, maka cukup hapus ketika melakukan komit .
File lokal yang sesuai untuk mesin tertentu dapat disimpan di cabang.
Saya akan menghindari menyimpannya secara lokal, karena terlalu menyakitkan untuk mengulang semua hal ini ketika laptop Anda dicuri atau virus memaksa Anda untuk menginstal ulang OS (dan, omong-omong, Anda menemukan bahwa cadangan terakhir Anda dilakukan dua tahun lalu) .
Di sisi lain, hati-hati dengan struktur file: konfigurasi lokal OK, sampai menjadi luar biasa, dan memaksa Anda untuk membuat perubahan tunggal di setiap file dari setiap 42 pengembang yang berpartisipasi dalam proyek.
Perhatikan peluang untuk menghapus kekhasan di antara mesin-mesin tersebut. Itu mungkin berarti:
Memberikan akses ke server SQL dev untuk mengganti instance lokal pada mesin pengembang,
Menggunakan layanan distribusi paket seperti Pypi atau npm untuk paket publik dan rekanan pribadi mereka untuk paket internal,
Minta anggota tim untuk menginstal versi perangkat lunak yang sama,
Buat pembaruan perangkat lunak setransparan mungkin,
Atau memungkinkan untuk menggunakan OS dan perangkat lunak yang diperlukan pada mesin dalam satu klik (ditambah waktu untuk setiap pengembang untuk menginstal Vim vs Emacs pilihannya, Chrome vs Firefox, dll.)
Begitu:
Mengapa tidak menggunakan tata letak yang sama pada setiap PC? Jalur dalam proyek harus relatif terhadap file proyek, yang berarti bahwa tidak masalah di mana proyek tersebut berada. Versi perangkat lunak dan pustaka lebih baik sama untuk menghindari bug samar yang hanya muncul di beberapa mesin, dan tidak mungkin direproduksi untuk anggota tim lainnya.
Contoh:
Dalam proyek yang dibuat dengan Visual Studio, Anda mungkin menemukan:
File itu sendiri. Jalur menjadi relatif, tidak masalah apakah pada mesin saya, proyek ini terletak di
H:\Development\Hello World Project\
sementara anggota tim lainnya memeriksa proyekC:\Work\HelloWorld\
.Ketergantungan, yaitu perpustakaan pihak ketiga dan in-house. Kedua jenis ini harus ditangani oleh NuGet yang membuat semua diskusi terkait konflik menjadi usang. Jika Anda tidak memiliki versi perpustakaan yang sama dengan yang saya miliki, minta NuGet untuk memperbarui dependensi. Sesederhana itu (ketika itu bekerja dengan baik, yang tidak selalu terjadi).
Perhatikan bahwa sangat penting untuk menjaga perpustakaan tetap di NuGet pribadi juga. Memiliki banyak perpustakaan yang disimpan di folder bersama atau dikirim melalui email di seluruh tim mengarah ke server CI yang anarki dan depresi.
Pengaturan. Sangat penting bahwa tim berbagi pengaturan yang sama. Jika setengah dari tim memutuskan untuk memperlakukan peringatan sebagai kesalahan dan setengah dari tim menjaga peringatan apa adanya, anggota bagian pertama dari tim akan menghabiskan waktu mereka menghilangkan peringatan yang dihasilkan oleh pengembang dari bagian kedua tim.
Pengaturan terkait utilitas. Itu rumit, karena beberapa anggota tim mungkin telah menginstal beberapa utilitas, sementara yang lain belum.
Sangat disarankan untuk menginstal perangkat yang sama. Jika beberapa programmer ingin menggunakan StyleCop, tetapi yang lain tidak, tim tidak akan menyelesaikan pekerjaan. Jika beberapa menggunakan kontrak Kode tetapi yang lain tidak, mereka akan memiliki masalah yang sama.
Simpan beberapa makefile di kontrol versi. Sudah lazim untuk membangun versi debug pada server CI juga dan mendorongnya ke klien yang mengalami bug yang rumit.
Saya akan menghindari kode seperti itu di tempat pertama. Untuk menguji sesuatu, gunakan unit test. Jika benar-benar membutuhkan waktu beberapa detik untuk menukar beberapa kode untuk keperluan debugging , maka lakukan, tetapi Anda akan menghapus kode ini dalam beberapa menit saja, jadi tidak perlu melakukan itu.
Saat Anda menggambarkannya, Anda harus menulis tes. Misalnya, jika Anda ingin memastikan bahwa:
melempar pengecualian ketika
temperature
lebih rendah dariAbsoluteZero
konstan, Anda tidak boleh bermain dengan kode itu sendiri. Sebagai gantinya, buat unit test yang akan:sumber
C:\Program Files\...
keC:\Program Files (x86)\...
Kami menggunakan
@@
komentar dalam kode untuk mengindikasikan sesuatu yang tidak siap, untuk tujuan pengujian, dll.Dengan begitu kita dapat berkomitmen, kolega tidak perlu menunggu terlalu lama untuk menyinkronkan, dan dapat melihat di mana masih ada pekerjaan yang sedang berjalan (mis. Pahami mengapa suatu bagian belum sepenuhnya berfungsi).
Kami melakukan pencarian global untuk
@@
mencegah 'sisa' sebelum memasuki tahap akhir pengujian beta, dll.Menggunakan disiplin itu, saya tidak melihat alasan untuk tidak hanya berkomitmen. Dengan cara ini, kami tidak memiliki cabang terpisah dan hanya satu 'protokol' tambahan untuk diikuti.
Sebagai manfaat tambahan, todo ini (biasanya hal-hal kecil) selalu ada dalam kode. Pengembang yang mengerjakannya dapat dengan cepat membahasnya, dan tidak perlu menyimpan daftar terpisah.
Anda tahu bagaimana perkembangannya: Anda bekerja di satu tempat tetapi Anda terus-menerus menggunakan pikiran Anda sebagai tumpukan (' Saya harus mengubahnya di sana ketika saya selesai di sini '). Hanya menuliskan
@@
komentar cepat akan mencegah tumpukan meluap.Saya bahkan menggunakan
@@name
untuk menunjukkan masalah yang perlu saya diskusikan dengan 'nama'.sumber
2 solusi HAMSTER:
Anda dapat menggunakan kait pra-komitmen untuk memeriksa kode Anda untuk beberapa kata kunci yang tidak biasa seperti HAMSTER. Hanya saja jangan biarkan orang melakukan kode yang telah HAMSTER dan menggunakannya setiap kali Anda melakukan peretasan kotor.
Opsi lain misalnya dalam C adalah dengan menggunakan #ifdef HAMSTER, maka kode hanya akan berjalan di mesin Anda di mana Anda memiliki flag kompiler HAMSTER.
sumber
Kami menempatkan segala sesuatu di bawah kendali sumber yang diperlukan untuk membangun dan menguji binari saat ini dan memahami mengapa semuanya dirancang / diimplementasikan / diuji seperti apa adanya.
Itu bahkan berlaku untuk paku http://www.extremeprogramming.org/rules/spike.html , seperti yang Anda jelaskan; kami hanya meng-host mereka di sub-pohon yang berbeda.
sumber
Berikut adalah sejumlah solusi yang kadang-kadang saya gunakan sendiri dalam berbagai keadaan, dan yang mungkin Anda pertimbangkan berguna ketika diterapkan pada alur kerja Anda sendiri:
Cabang ringan yang bisa tergencet.
Git hebat dalam hal ini. Meretas cabang, membuat banyak komitmen, dan kemudian rebase atau remas riwayat Anda untuk mengedit suara.
Gunakan antrian tambalan di atas SCM Anda.
Saya sering menemukan diri saya menggunakan StGit untuk mengapung patch ke atas cabang saya saat ini. Ketika saya sudah selesai dengan cabang, saya bisa pop mereka kembali dari tumpukan sebelum penggabungan, squashing, atau rebasing, atau saya bisa menggabungkan mereka ke dalam basis kode utama jika saya ingin menyimpannya.
Gunakan RCS sebagai SCM "out-of-band" untuk eksperimen kecil.
Terkadang Anda hanya ingin memeriksa file yang sedang berlangsung dengan cara sekali pakai, tanpa harus membersihkan riwayat setelahnya. Saya biasanya menggunakan RCS untuk bagian dalam Git atau SVN ini. Saya memberi tahu Git untuk mengabaikan artefak RCS, memeriksa pekerjaan saya yang sedang berlangsung di RCS, dan ketika saya suka hasilnya saya hanya melemparkan
*,v
file atau seluruh direktori RCS. Hanya saja, jangan menjalankangit clean -fdx
atau serupa sampai Anda telah melakukan pekerjaan Anda ke SCM "nyata" Anda, atau Anda akan menyesalinya.Stash yang dinamai.
Git-isme lain, tetapi berguna:
git stash save --include-untracked <some-cool-title>
dapat berguna dalam keadaan darurat. Anda dapat menyimpan, pop, dan melamar pekerjaan yang sedang berjalan dengan cara ini, dan melihat berbagai pos pemeriksaan Anda melaluigit stash list
ataugit reflog --all
. SCM lain mungkin memiliki fitur serupa, tetapi jarak tempuh Anda mungkin sangat bervariasi dengan yang ini.sumber
Beberapa dari kode sementara itu benar-benar hanya merupakan manifestasi dari metodologi build / test / development yang tidak tepat, dan mudah-mudahan keberadaan mereka akan memotivasi peningkatan di masa depan.
Setidaknya pada git, Anda harus bebas untuk dipusingkan dengan sejumlah cabang fitur hingga siap untuk digabung menjadi master / trunk.
Kontrol versi seharusnya membantu Anda, dan lebih sering saya menghargai wawasan dari cara kesalahan (atau mungkin hanya keputusan yang kurang intuitif) dibuat di masa lalu, dan membuat keputusan yang lebih tepat untuk saat ini.
sumber
Saya percaya bahwa beberapa sistem akan memberikan peringatan saat melihat TODO dalam komentar, jadi
mungkin semua yang diperlukan jika Anda dapat menemukan opsi yang relevan di beberapa bagian lingkungan pengembangan Anda, atau hanya menempelkan semacam perintah grep di buildfile Anda. Mungkin juga dimungkinkan untuk mengaturnya
// HACK
atau setiap string sewenang-wenang untuk diambil.Ini lebih sederhana daripada mengatur kode Anda dengan cara tertentu dan berharap orang akan ingat untuk tidak menggunakannya. Ini juga membuatnya lebih aman untuk mengikuti saran @gbjbaanb (jika Anda dapat memastikan bahwa semua orang melihat peringatan!).
sumber
Tidak pernah berbahaya untuk meletakkan kode di kontrol sumber.
Setiap item yang Anda sebutkan harus dalam kontrol sumber.
sumber