cRGit adalah sebuah sistem kontrol versi sederhana yang terinspirasi oleh Git dan ditulis dari awal menggunakan Ruby. Proyek ini dibuat untuk tujuan edukasi guna memahami cara kerja internal Git, mengikuti konsep dari seri Rebuilding Git in Ruby.
https://thoughtbot.com/blog/rebuilding-git-in-ruby
- Inisialisasi repositori baru.
- Menambahkan file ke staging area (indeks).
- Melakukan commit untuk perubahan yang sudah di-stage.
- Melihat status repositori.
- Ruby (dikembangkan dengan versi 3.x)
- Clone repositori ini:
git clone <url-repositori-anda> cd cRGit
- Skrip dirancang untuk dijalankan secara langsung. Tidak ada langkah instalasi lebih lanjut yang diperlukan.
chmod +x bin/*
Untuk membuat repositori cRGit baru di direktori saat ini, jalankan:
./bin/crgit.rb initPerintah ini akan membuat direktori .crgit, tempat cRGit menyimpan semua datanya, termasuk objek dan referensi.
Untuk menyiapkan file (stage) untuk commit berikutnya, gunakan perintah add:
# Buat file baru
echo "hello world" > hello.txt
# Tambahkan ke indeks
./bin/crgit.rb add hello.txt
# Atau semua file di direktori
./bin/crgit.rb add .Untuk melihat file mana yang sudah di-stage dan apa commit saat ini, gunakan status:
./bin/crgit.rb statusUntuk menyimpan perubahan yang sudah di-stage secara permanen, buat sebuah commit:
./bin/crgit.rb commitPerintah ini akan membuka editor teks default Anda ($EDITOR, misal: vi atau nano) untuk menulis pesan commit. Setelah menyimpan dan menutup editor, sebuah objek commit baru akan dibuat.
bin/: Berisi skrip yang dapat dieksekusi untuk setiap perintah.lib/: Berisi kelas-kelas Ruby inti yang mengimplementasikan logika sistem kontrol versi.crgit/object.rb: Menangani baca/tulis objek (blob, tree, commit).crgit/index.rb: Mengelola staging area.crgit/repo.rb: Mengelola struktur repositori dan referensi sepertiHEAD.crgit/commit.rb: Logika untuk membuat objek commit.crgit/tree.rb: Logika untuk membuat objek tree dari indeks.
cRGit meniru model objek dasar Git:
- Blob: Saat Anda menjalankan
add, konten file akan dikompresi, hash SHA-1-nya dihitung, dan disimpan sebagai objek "blob" di direktori.crgit/objects. - Indeks: Perintah
addjuga mencatat path file dan hash SHA-1 blob-nya di dalam file.crgit/index. Ini berfungsi sebagai staging area. - Tree: Saat Anda menjalankan
commit,cRGitakan membangun objek "tree" dari indeks. Sebuah tree merepresentasikan isi sebuah direktori, memetakan nama file/direktori ke hash SHA blob/tree. - Commit: Sebuah objek "commit" kemudian dibuat, yang menunjuk ke hash SHA dari root tree dan menyertakan metadata seperti penulis dan pesan commit.
- HEAD: Terakhir, referensi
HEADdiperbarui untuk menunjuk ke hash SHA dari commit baru, menjadikannya sebagai ujung dari branch saat ini.