**Concurrent Versions System** atau **Sistem Kontorl Versi (CVS)** adalah sistem kontrol revisi yang awalnya dikembangkan oleh Dick Grune pada bulan Juli 1986. CVS beroperasi sebagai antarmuka untuk RCS, sebuah sistem pendahulu yang beroperasi pada file tunggal. CVS mengembangkan RCS dengan menambahkan dukungan untuk pelacakan perubahan pada tingkat repositori serta model klien-server. CVS dirilis di bawah ketentuan GNU General Public License sehingga perangkat lunak dapat digunakan secara gratis.

Desain
------

CVS beroperasi sebagai perangkat lunak antarmuka untuk Revision Control System (RCS), sebuah sistem kontrol versi yang lebih tua yang mengelola file individual/tunggal dan bukan untuk seluruh proyek repositori. CVS memperluas fungsinya dari RCS dengan menambahkan dukungan untuk pelacakan perubahan pada tingkat repositori sekaligus model klien-server. File dilacak menggunakan format catatan yang sama seperti dalam RCS, dengan direktori tersembunyi yang berisi file log yang sesuai untuk setiap file dalam repositori.

CVS menggunakan kompresi delta untuk penyimpanan yang efisien dari versi-versi yang berbeda dari file yang sama. Membuat CVS dapat bekerja dengan baik untuk file teks besar dengan sedikit perubahan dari satu versi ke versi berikutnya, yang umumnya terjadi pada file kode sumber. Di sisi lain, saat CVS diminta untuk menyimpan file sebagai biner, ia akan menyimpan setiap versi individu di server. Hal ini umumnya digunakan untuk file non-teks seperti gambar yang dieksekusi, di mana sulit untuk membuat delta yang kompak antara kedua versi.

CVS tidak menyertakan tautan simbolik karena ketika disimpan dalam sistem kontrol versi, tautan simbolik dapat menimbulkan risiko keamanan. Sebagai contoh, tautan simbolik ke file sensitif dapat disimpan di repositori, membuat file sensitif dapat diakses bahkan ketika tidak di-check-in/push. Sebagai pengganti tautan simbolik, skrip yang memerlukan hak istimewa dan intervensi untuk dieksekusi agar di-check-in/push ke CVS.

Operasi
-------

CVS menyebut satu proyek (kumpulan file terkait) yang dikelolanya sebagai modul. Sebuah server CVS menyimpan modul-modul yang dikelolanya di repositorinya. Programer mendapatkan salinan modul dengan melakukan check out/pull. File yang sudah di-check out berfungsi sebagai salinan kerja, bak pasir/inkubator, atau ruang kerja. Perubahan pada salinan kerja tercermin di repositori dengan melakukan commit. Update berarti mendapatkan atau menggabungkan perubahan di repositori dengan salinan kerja.

CVS menggunakan arsitektur klien–server: server menyimpan versi terkini dari suatu proyek dan sejarahnya, dan klien terhubung ke server untuk "check out" atau "pull" salinan lengkap proyek, agar dapat bekerja pada salinan tersebut, dan kemudian "check in" atau "push" atas perubahan yang baru dibuat. Server CVS dapat mengizinkan "akses baca tanpa identitas", di mana klien dapat check out dan membandingkan versi dengan kata sandi kosong atau sederhana (contohnya, "anoncvs"); hanya saat melakukan check-in perubahan diperlukan akun dan kata sandi pribadi dalam skenario ini. Beberapa pengembang dapat bekerja pada proyek yang sama secara bersamaan, masing-masing mengedit file dalam "salinan kerja" mereka sendiri, dan mengirimkan (atau check in) perubahannya ke server. Untuk menghindari konflik, server hanya menerima perubahan yang dilakukan pada versi terkini dari sebuah file. Oleh karena itu, diharapkan pengembang untuk selalu menjaga salinan kerjanya tetap terkini dengan menggabungkan perubahan orang lain secara teratur. Tugas ini sebagian besar ditangani secara otomatis oleh klien CVS, memerlukan intervensi manual hanya saat konflik pengeditan muncul antara modifikasi yang sudah di-check in dan versi lokal yang belum di-check.

Klien juga dapat menggunakan perintah "update" untuk membawa salinan lokal mereka ke versi terbaru di server. Klien juga dapat membandingkan versi, meminta sejarah perubahan lengkap, atau check out snapshot historis dari proyek (misalnya: berdasarkan tanggal tertentu). Jika operasi check-in berhasil, maka nomor versi semua file yang terlibat akan otomatis meningkat, dan server menulis baris deskripsi yang diberikan pengguna, tanggal, dan nama pengarang ke file lognya. CVS juga dapat menjalankan skrip pemrosesan log eksternal yang ditentukan pengguna setelah setiap commit. Skrip ini diinstal melalui entri dalam file CVS `loginfo`, yang dapat memicu pemberitahuan email atau mengonversi data log menjadi format berbasis web.

CVS juga dapat menjaga cabang atau branching yang berbeda dari suatu proyek. Misalnya, versi yang sudah dirilis dari proyek perangkat lunak dapat membentuk satu cabang, digunakan untuk perbaikan bug, sementara versi dalam pengembangan terkini, dengan perubahan besar dan fitur baru, dapat membentuk cabang terpisah. CVS mengasumsikan bahwa sebagian besar pekerjaan dilakukan di "trunk", dan cabang seharusnya pada umumnya bersifat singkat atau historis. Ketika digunakan seperti yang dirancang, cabang dapat dikelola dengan mudah dan operasi cabang menjadi efisien dan cepat.

Portabilitas
------------

Server pada perangkat lunak biasanya berjalan di Unix (meskipun setidaknya server CVSNT juga mendukung berbagai varian Microsoft Windows), sementara klien CVS dapat berjalan di platform sistem operasi apa pun.

Sejarah
-------

Grune mengatakan:

> Saya membuat CVS agar dapat bekerja sama dengan mahasiswa saya, Erik Baalbergen dan Maarten Waage, pada kompilator bahasa C ACK (Amsterdam Compiler Kit). Kami bertiga memiliki jadwal yang sangat berbeda (salah satu mahasiswa bekerja secara teratur dari jam 9 pagi hingga 5 sore, yang lain tidak teratur, dan saya hanya bisa bekerja pada proyek tersebut di malam hari). Proyek mereka berlangsung dari Juli 1984 hingga Agustus 1985. Awalnya, CVS disebut cmt, dengan alasan yang jelas karena memungkinkan kami untuk melakukan commit versi secara independen.
> 
> 

Grune secara publik merilis kode tersebut pada 23 Juni 1986.[10]

Kode yang akhirnya berkembang menjadi versi CVS saat ini dimulai dengan Brian Berliner pada April 1989, dengan kontribusi selanjutnya dari Jeff Polk dan banyak kontributor lainnya. Brian Berliner menulis makalah yang memperkenalkan perbaikan-perbaikan pada program CVS—yang menjelaskan bagaimana alat ini diperluas dan digunakan secara internal oleh Prisma, pengembang pihak ketiga yang bekerja pada kernel SunOS, dan dirilis untuk kepentingan komunitas di bawah lisensi GPL. Pada 19 November 1990, CVS versi 1.0 dikirimkan ke Free Software Foundation untuk pengembangan dan distribusi.

Versi terbaru dirilis pada 8 Mei 2008.

Penerus
-------

Di dunia perangkat lunak sumber terbuka, CVS telah lama menjadi pilihan banyak pengembang untuk alat untuk kontrol versi. Hal tersebut dikarenakan CVS sendiri adalah perangkat lunak gratis dan pengoperasiannya yang tidak membatasi serta dukungannya untuk operasi berjaringan yang memungkinkan puluhan programmer yang terpisah secara geografis untuk berbagi pekerjaan mereka sesuai dengan sifat kolaboratif dunia sumber terbuka dengan baik. CVS dan model pengembangannya yang semi-kaotis telah menjadi pondasi dari sumber terbuka.

Seiring waktu, para pengembang telah membuat sistem kontrol versi baru berbasis CVS untuk menambah fitur, mengubah model operasional, dan meningkatkan produktivitas pengembang. Proyek pengganti CVS termasuk diantaranya CVSNT dan Subversion.

Catatan
-------

* David Thomas; Andrew Hunt (2003). *Pragmatic Version Control Using CVS*Perlu mendaftar (gratis). The Pragmatic Programmers. ISBN 0-9745140-0-4.
* Jennifer Vesperman (2006). *Essential CVS* (edisi ke-2e). O'Reilly. ISBN 0-596-52703-9.
* Per Cederqvist; et al. (2002). *Version Management with CVS*. ISBN 0-9541617-1-8. Diarsipkan dari versi asli tanggal 2014-08-05. Diakses tanggal 2009-11-25.  Parameter `|url-status=` yang tidak diketahui akan diabaikan (bantuan)
* Karl Franz Fogel; Moshe Bar (2003). *Open Source Development with CVS*. ISBN 1-932111-81-6. Diarsipkan dari versi asli tanggal 2014-07-16. Diakses tanggal 2002-02-05.  Parameter `|url-status=` yang tidak diketahui akan diabaikan (bantuan)

Referensi
---------

1. ↑  Stable CVS Version 1.11.23 Released!
2. ↑  CVS Feature Version 1.12.13 Released! \* Security Update \*
3. ↑  "Contents of /ccvs/README".
4. "CVS--Concurrent Versions System v1.12.12.1: Overview". Diarsipkan dari versi asli tanggal 15 April 2012. Diakses tanggal 9 December 2011.  Parameter `|url-status=` yang tidak diketahui akan diabaikan (bantuan)
5. Charles D. Cranor; Theo de Raadt (1999). "Opening The Source Repository With Anonymous CVS, USENIX 1999" (PDF). Diarsipkan dari versi asli (PDF) tanggal 2022-10-09.  Parameter `|url-status=` yang tidak diketahui akan diabaikan (bantuan)
6. Stopak, Jacob (November 30, 2019). "The Evolution of Version Control System (VCS) Internals". Diakses tanggal 22 September 2020.
7. Collins-Sussman, Ben; Greg Ward (September 2004). "Subversion Users: Re: Performance (Subversion vs. CVS)". *subversion-users*. Diakses tanggal 2010-07-07.
8. West, Adrian (July 2004). "cvs branchtag performance fix". Diarsipkan dari versi asli tanggal 2009-08-03. Diakses tanggal 2010-07-07.  Parameter `|url-status=` yang tidak diketahui akan diabaikan (bantuan)
9. Dick Grune (July 3, 1986). "*CVS, an RCS front-end (cvs)*". mod.sources. (Web link).
10. "[cvs] Contents of /ccvs/NEWS". *cvs.savannah.gnu.org*.
11. "CVS II: Parallelizing Software Development - Berliner (ResearchIndex)". Diarsipkan dari versi asli tanggal September 9, 2004.
12. "Concurrent Versions System - News: Stable CVS Version 1.11.23 Released! [Savannah]". *savannah.nongnu.org*.
13. "Subversion FAQ: Why does this project exist?". Subversion. Diakses tanggal September 21, 2009.
14. "Concurrent Versions System CVS". *dickgrune.com*.
15. "Dispelling Subversion FUD". Ben Collins-Sussman. Diarsipkan dari versi asli tanggal July 18, 2011. Diakses tanggal June 30, 2010.  Parameter `|url-status=` yang tidak diketahui akan diabaikan (bantuan)
16. Ben Collins-Sussman, Version Control with Subversion For Subversion 1.1, 2005