Haruskah kode sementara diletakkan di bawah kontrol versi dan bagaimana?

29

Berikut adalah beberapa contoh kode sementara / lokal. Diperlukan untuk bekerja dengan basis kode, tetapi akan berbahaya untuk menjadi bagian darinya:

  1. File proyek. Jalur mungkin perlu diedit untuk mencerminkan tata letak pada PC saat ini.
  2. Makefiles. Misalnya optimasi mungkin perlu dimatikan saat debugging, tetapi tidak untuk server CI.
  3. Retas buruk kotor. Misalnya return 7di 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?

Vorac
sumber
Apakah kode sementara ini perlu diperbarui dari proyek asli selama periode penggunaan sementara?
JeffO
@ Jeff, tidak yakin apakah saya mengerti Anda. Cuplikan kotor berukuran kecil dan jarang berbenturan dengan kode yang sedang dikembangkan. Namun, @ Blrfl, sangat berbahaya bagi mereka untuk dimasukkan ke dalam arus utama. Bayangkan return 7di trunkJumat malam, setelah penggabungan yang buruk di musim panas.
Vorac
@Vacac - untuk itulah ulasan dan pengujian kode! Saya dapat menunjukkan kepada Anda jauh lebih buruk dari itu - kode yang tidak berfungsi meskipun tampak baik pada pandangan pertama. Return 7.. kalau saja mereka semua begitu jelas!
gbjbaanb
@Vorac: Itu lebih merupakan komentar filosofis daripada yang lain.
Blrfl
2
Apakah ada cara untuk mengetahui di lingkungan mana Anda berada? Misalnya, Anda dapat mengaturnya untuk mengeksekusi kode jika mendeteksi Anda berada di lingkungan dev, tetapi tidak di val / prod. Dengan begitu Anda tidak perlu terus-menerus menambah / menghapus kode placeholder saat melakukan.
Saggio

Jawaban:

46

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.

gbjbaanb
sumber
5
Sepakat. Bercabang adalah jalan yang harus ditempuh. Buat cabang, lakukan apa pun yang Anda inginkan di sana dan gabungkan kode yang sudah selesai saat sudah lengkap. Kepala harus diperlakukan sebagai versi rilis yang dapat diunduh dan digunakan klien kapan saja.
Cameron McKay
Jawaban yang bagus, dari apa yang saya lihat, GIT memperkenalkan versi lokal untuk membantu orang-orang yang ingin memiliki log karya lokal mereka. Kode sementara harus tetap berada di mesin dev sampai ia siap memasukkannya ke dalam repo
InformedA
2
Saya akan mencetak poster besar bertuliskan "SEMUA KODE SEMENTARA" dan tempelkan di dinding. Mungkin dalam Komik Sans.
Bob Tway
2
@MattThrower dalam kutipan gelembung, datang dari bibir Clippy?
gbjbaanb
1
Kode atau kode yang tidak berjalan yang tidak dikompilasi tidak boleh dikomit ke kontrol versi.
Tulains Córdova
17

File proyek. Jalur mungkin perlu diedit untuk mencerminkan tata letak pada PC saat ini.

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.

Makefiles. Misalnya optimasi mungkin perlu dimatikan saat debugging, tetapi tidak untuk server CI.

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.

Retas buruk kotor. Misalnya mengembalikan 7 di tengah fungsi, untuk menguji sesuatu, tergantung pada fungsinya, dan diduga rusak pada nilai 7. Atau 7 adalah kode tombol yang belum diterapkan, yang saya laksanakan dan perlu Tes sepanjang hidup cabang saya.

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.

Winston Ewert
sumber
Terkadang saya perlu melakukan peretasan kecil ke sebuah file, sementara pada saat yang sama menulis kode produksi dalam file yang sama. svntidak mendukung komitmen sebagian file, jadi menyusahkan dalam situasi tersebut. Sebagian besar kolega saya baru saja melakukan peretasan ke cabang dan membersihkannya saat bergabung trunk. Namun, saya terganggu (dan membuat kesalahan selama penggabungan, dan penggabungan dalam svn adalah suci dan tidak berubah) lebih mudah dan karenanya pertanyaan ini.
Vorac
@Vorac, saya akan melihat ke dalam kait subversi yang memungkinkan Anda menjalankan skrip saat melakukan. Seharusnya dimungkinkan untuk menulis skrip yang menolak penggabungan jika mengandung XXX atau yang sejenisnya.
Winston Ewert
1
@Vacac: Jika Anda menggunakan TortoiseSVN, Anda dapat menggunakan Pulihkan Setelah Berkomitmen pada file untuk melakukan sebagian, gunakan alat berbeda atau editor Anda untuk sementara waktu menghapus blok yang tidak ingin Anda komit, kemudian komit. Tortoise akan mengembalikan file lengkap setelah dan Anda dapat mengkomit blok yang tersisa jika siap. Ini dapat dilakukan dengan membuat cadangan cepat file dan mengembalikannya setelah komit pertama.
leokhorn
5

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:

File proyek. Jalur mungkin perlu diedit untuk mencerminkan tata letak pada PC saat ini.

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 proyek C:\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.

Makefiles. Misalnya optimasi mungkin perlu dimatikan saat debugging, tetapi tidak untuk server CI.

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.

Retas buruk kotor. Misalnya mengembalikan 7 di tengah fungsi, untuk menguji sesuatu, tergantung pada fungsinya, dan diduga rusak pada nilai 7.

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:

class TemperatureConverter
{
    public int CelsiusToFahrenheit(int temperature)
    {
        ...
    }
}

melempar pengecualian ketika temperaturelebih rendah dari AbsoluteZerokonstan, Anda tidak boleh bermain dengan kode itu sendiri. Sebagai gantinya, buat unit test yang akan:

  • dokumentasikan sendiri kode Anda,
  • meningkatkan keandalan kode Anda,
  • memastikan bahwa pengelola dapat mengandalkan pengujian regresi saat memodifikasi metode di atas,
  • melayani pengembang lain dari tim Anda yang mungkin perlu melakukan tes yang sama.
Arseni Mourzenko
sumber
2
Sayangnya saya tidak punya pengalaman dengan tes menulis. Platform saat ini melibatkan cpu ARM, mengkonfigurasi beberapa perangkat keras sebagai respons terhadap perintah USB. Tidak ada umpan balik dari perangkat keras ke cpu.
Vorac
2
Jika kode sementara mungkin memiliki efek tetap, bahkan jika kode mungkin tidak pernah diperlukan setelah efek tersebut tercapai, saya akan berpikir menyimpan kode di suatu tempat akan lebih bijak jika ada pertanyaan tentang apakah efek tersebut dicapai dengan benar. Sebagai contoh, jika beberapa format database untuk suatu produk diubah ketika sedang dalam pengembangan, orang mungkin menulis utilitas sekali saja untuk mengubah format. Utilitas mungkin tidak pernah diperlukan setelah satu-satunya database yang ada dalam format lama dikonversi, tetapi mungkin perlu untuk memeriksa bagaimana konversi dilakukan.
supercat
Untuk file proyek Visual Studio, saya memiliki pengalaman yang baik menghasilkan mereka dengan CMake, yang memungkinkan beberapa fleksibilitas tentang bagaimana kode sumber dan kode yang dikompilasi berada di sistem file. Kemudian saya mengontrol versi file input CMake bukan file proyek VS. Tetapi ini masih sesuai dengan diktum Anda, "Kontrol versi harus berisi kode dan konfigurasi yang diperlukan untuk membangun aplikasi." Saya sepenuhnya setuju dengan itu!
David K
Dengan VS, Anda kadang-kadang perlu berhati-hati untuk memastikan Anda tidak memiliki jalur absolut menyelinap masuk. Saya telah mengalami lebih dari beberapa masalah dengan referensi rusak ketika memutakhirkan ke win64 dan memiliki perpustakaan untuk platform pihak ke-3 pindah dari C:\Program Files\...keC:\Program Files (x86)\...
Dan Neely
@DanNeely: itu sebabnya perpustakaan pihak ketiga harus ditangani oleh NuGet.
Arseni Mourzenko
2

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 @@nameuntuk menunjukkan masalah yang perlu saya diskusikan dengan 'nama'.

Jan Doggen
sumber
1

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.

pengguna143985
sumber
0

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.

Solkar
sumber
0

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:

  1. 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.

  2. 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.

  3. 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 menjalankan git clean -fdxatau serupa sampai Anda telah melakukan pekerjaan Anda ke SCM "nyata" Anda, atau Anda akan menyesalinya.

  4. 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 melalui git stash listatau git reflog --all. SCM lain mungkin memiliki fitur serupa, tetapi jarak tempuh Anda mungkin sangat bervariasi dengan yang ini.

CodeGnome
sumber
0

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.

Prusswan
sumber
0

Saya percaya bahwa beberapa sistem akan memberikan peringatan saat melihat TODO dalam komentar, jadi

// TODO: remove this hack.

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!).

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.

GKFX
sumber
0

Tidak pernah berbahaya untuk meletakkan kode di kontrol sumber.

Setiap item yang Anda sebutkan harus dalam kontrol sumber.

Toby Allen
sumber