Saya membaca banyak pertanyaan yang menanyakan tentang alat kontrol kode sumber sederhana dan Git sepertinya pilihan yang masuk akal. Saya sudah menjalankannya, dan sejauh ini berfungsi dengan baik. Salah satu aspek yang saya suka tentang CVS adalah penambahan otomatis nomor versi.
Saya mengerti bahwa ini kurang masuk akal dalam repositori terdistribusi, tetapi sebagai pengembang, saya menginginkan / membutuhkan sesuatu seperti ini. Izinkan saya menjelaskan alasannya:
Saya menggunakan Emacs. Secara berkala saya memeriksa dan mencari versi baru dari file sumber Lisp untuk paket pihak ketiga. Katakanlah saya punya file, foo.el, yang menurut header, adalah versi 1.3; jika saya mencari versi terbaru dan melihat versi 1.143 atau 2.6 atau apa pun, saya tahu saya cukup jauh di belakang.
Jika sebaliknya saya melihat beberapa hash 40 karakter, saya tidak akan tahu mana yang nanti atau tahu berapa lama nanti. Saya benar-benar akan membencinya jika saya harus memeriksa ChangeLogs secara manual hanya untuk mendapatkan gambaran tentang seberapa lama saya.
Sebagai seorang pengembang, saya ingin menyampaikan rasa hormat ini, seperti yang saya lihat, kepada orang-orang yang menggunakan keluaran saya (dan mungkin saya bercanda bahwa ada orang, tapi mari kita tinggalkan sejenak). Saya tidak ingin mengingat untuk selalu menaikkan angka sialan itu sendiri, atau cap waktu atau semacamnya. Itu adalah PITA yang nyata, dan saya tahu itu dari pengalaman.
Jadi alternatif apa yang saya miliki? Jika saya tidak bisa mendapatkan setara $ Id: $, bagaimana lagi saya bisa memberikan apa yang saya cari?
Saya harus menyebutkan bahwa harapan saya adalah bahwa pengguna akhir TIDAK akan menginstal Git dan bahkan jika mereka memilikinya, tidak akan memiliki repositori lokal (memang, saya berharap tidak membuatnya tersedia dengan cara itu).
sumber
filter-branch
atau sesuatu.git describe
perintah tepat sebelum Anda membangun, menyimpan output di file header, atau menanamkan nilai dalam kode Anda.Sekarang ada dukungan untuk $ Id: $ di Git. Untuk mengaktifkannya untuk file README Anda harus memasukkan "README ident" ke dalam .gitattributes . Mendukung karakter pengganti pada nama file. Lihat man gitattributes untuk detailnya.
sumber
$Id$
disebutkan. Apa yang disimpan persis seperti yang Anda dapatkan. Bagaimanapun, versinya adalah milik koleksi lengkap file yang membuat komit, bukan satu file pada khususnya (Ide itu adalah sisa dari masa RCS, atau mungkin SCCS yang harus disalahkan di sini ... Karena CVS hanyalah memuliakan frontend ke RCS, dan SVN mencoba menjadi seperti CVS-workalike, itu macet.).Ini bukanlah permintaan yang tidak masuk akal dari OP.
Kasus penggunaan saya adalah:
/usr/local/bin
saat mereka siap.Saya menggunakan tiga mesin terpisah dengan repositori Git yang sama di atasnya. Alangkah baiknya mengetahui "versi" dari file yang saat ini saya miliki
/usr/local/bin
tanpa harus melakukan manual "diff -u <repo version> <version in / usr / local / bin>".Bagi Anda yang bersikap negatif, ingatlah ada kasus penggunaan lain di luar sana. Tidak semua orang menggunakan Git untuk pekerjaan kolaboratif dengan file di repositori Git menjadi lokasi "terakhir" mereka.
Bagaimanapun, cara saya melakukannya adalah dengan membuat file atribut di repositori seperti ini:
Kemudian letakkan $ Id $ di suatu tempat di file (saya suka meletakkannya setelah shebang).
Komit. Perhatikan bahwa ini tidak secara otomatis melakukan ekspansi seperti yang saya harapkan. Anda harus membuat ulang file tersebut, misalnya,
Dan kemudian Anda akan melihat perluasannya, misalnya:
Beberapa informasi bagus ada di Bagaimana cara mengaktifkan string ident untuk repositori Git? .
sumber
git co
harus dilakukan? Saya mendapat pesan kesalahan "git: 'co' is not a git command. See 'git --help'.
" Harus itugit checkout
?Tidak yakin ini akan pernah ada di Git. Untuk mengutip Linus :
Sangat mudah untuk memeriksa log, meskipun - jika Anda melacak cabang stabil foo.el, Anda dapat melihat komit baru apa yang ada di log cabang stabil yang tidak ada di salinan lokal Anda. Jika Anda ingin menyimulasikan nomor versi internal CVS, Anda dapat membandingkan stempel waktu komit terakhir.
Edit: Anda harus menulis atau menggunakan skrip orang lain untuk ini, tentu saja, jangan lakukan ini secara manual.
sumber
$Id$
melaluiident
atribut, seperti yang disebutkan dalam jawaban lain di sini, menunjukkan bahwa bahkan git itu sendiri bukanlah sandera bagi opini Linus.Seperti yang saya tulis sebelumnya :
sumber
Saya memiliki masalah yang sama. Saya perlu memiliki versi yang lebih sederhana daripada string hash dan tersedia untuk orang-orang yang menggunakan alat tersebut tanpa perlu terhubung ke repositori.
Saya melakukannya dengan hook pra-komit Git dan mengubah skrip saya agar dapat memperbarui dirinya sendiri secara otomatis.
Saya mendasarkan versi dari jumlah komit yang dilakukan. Ini adalah kondisi perlombaan ringan karena dua orang dapat berkomitmen pada waktu yang sama dan keduanya berpikir mereka melakukan nomor versi yang sama, tetapi kami tidak memiliki banyak pengembang dalam proyek ini.
Sebagai contoh, saya memiliki skrip yang saya check in yang ada di Ruby, dan saya menambahkan kode ini ke dalamnya - ini adalah kode yang cukup sederhana sehingga mudah untuk porting ke bahasa yang berbeda jika Anda memeriksa sesuatu dalam bahasa yang berbeda (meskipun jelas ini tidak akan dengan mudah bekerja dengan check-in yang tidak dapat dijalankan seperti file teks). Aku sudah menambahkan:
Dan kemudian saya menambahkan opsi baris perintah (-updateVersion) ke skrip jadi jika saya menyebutnya sebagai "tool -updateVersion" maka itu hanya memanggil updateVersion untuk alat yang mengubah nilai "MYVERSION" itu sendiri dan kemudian keluar (Anda bisa memilikinya juga memperbarui file lain jika dibuka juga jika Anda mau).
Setelah itu diatur, saya pergi ke kepala Git dan membuat skrip bash satu baris yang dapat dieksekusi
.git/hooks/pre-commit
.Skrip hanya berubah ke kepala direktori Git dan memanggil skrip saya dengan
-updateVersion
.Setiap kali saya memeriksa apakah skrip pra-komit dijalankan yang menjalankan skrip saya dengan -updateVersion, dan kemudian variabel MYVERSION diperbarui berdasarkan pada jumlah komit yang akan dibuat. Sihir!
sumber
git updateVersion
? Tolong berikan beberapa contoh bagaimana itu disebut.Jika memiliki $ Kata kunci $ sangat penting bagi Anda, maka mungkin Anda dapat mencoba melihat Mercurial sebagai gantinya? Ini memiliki ekstensi hgkeyword yang menerapkan apa yang Anda inginkan. Mercurial menarik sebagai DVCS.
sumber
Sesuatu yang dilakukan dengan repositori Git adalah menggunakan
tag
objek. Ini dapat digunakan untuk menandai komit dengan semua jenis string dan dapat digunakan untuk menandai versi. Anda dapat melihat tag itu di repositori dengangit tag
perintah, yang mengembalikan semua tag.Sangat mudah untuk memeriksa tag. Misalnya, jika ada tag
v1.1
Anda bisa memeriksa tag itu ke cabang seperti ini:Karena ini adalah objek tingkat atas, Anda akan melihat seluruh riwayat untuk komit tersebut, serta dapat menjalankan diff, membuat perubahan, dan menggabungkan.
Tidak hanya itu, tetapi sebuah tag tetap ada, bahkan jika cabang tempatnya telah dihapus tanpa digabungkan kembali ke baris utama.
sumber
export-subst
fiturgitattributes(5)
. Ini tentu saja membutuhkan penggunaangit archive
untuk membuat rilis, dan hanya dalam file tar yang dihasilkan hasil edit substitusi akan terlihat.Jika saya mengerti dengan benar, pada dasarnya, Anda ingin tahu berapa banyak komit yang telah terjadi pada file tertentu sejak terakhir kali Anda memperbarui.
Pertama-tama, dapatkan perubahan di remote origin, tapi jangan gabungkan ke
master
cabang Anda :Kemudian dapatkan log perubahan yang terjadi pada file tertentu antara
master
cabang Anda dan remoteorigin/master
.Ini memberi Anda pesan log dari semua komit yang telah terjadi di repositori jarak jauh sejak Anda terakhir bergabung
origin/master
ke dalammaster
.Jika Anda hanya ingin menghitung perubahannya, gunakan pipa ke
wc
. Katakan, seperti ini:sumber
Jika Anda hanya ingin orang lain mengetahui seberapa jauh mereka ketinggalan zaman, Git dapat memberi tahu mereka tentang hal itu dengan beberapa cara yang cukup mudah. Mereka membandingkan tanggal komit terakhir di bagasi dan bagasi Anda, misalnya. Mereka dapat menggunakan
git cherry
untuk melihat berapa banyak komit yang terjadi di bagasi Anda yang tidak ada di bagasi mereka.Jika hanya itu yang Anda inginkan, saya akan mencari cara untuk menyediakannya tanpa nomor versi.
Juga, saya tidak akan repot-repot menyampaikan kesopanan kepada siapa pun kecuali Anda yakin mereka menginginkannya. :)
sumber
Untuk menerapkan perluasan ke semua file di semua sub-direktori dalam repositori, tambahkan
.gitattributes
file ke direktori tingkat atas dalam repositori (yaitu tempat Anda biasanya meletakkan.gitignore
file) yang berisi:Untuk melihat efeknya, Anda harus melakukan pembayaran file yang efektif terlebih dahulu, seperti menghapus atau mengeditnya dengan cara apa pun. Kemudian pulihkan dengan:
Dan Anda akan melihat
$Id$
diganti dengan sesuatu seperti:Dari
man gitattributes
:ID ini akan berubah setiap kali versi baru file dilakukan.
sumber
RCS ID cocok untuk proyek file tunggal, tetapi untuk proyek lain $ Id $ tidak mengatakan apa-apa tentang proyek tersebut (kecuali Anda melakukan check-in palsu secara paksa ke file versi dummy).
Masih ada orang yang mungkin tertarik bagaimana mendapatkan yang setara dengan $ Penulis $, $ Tanggal $, $ Revisi $, $ RCSfile $, dll. Pada tingkat per file atau pada tingkat komit (bagaimana meletakkannya di tempat beberapa kata kunci adalah yang lain pertanyaan). Saya tidak punya jawaban tentang ini, tetapi lihat persyaratan untuk memperbaruinya, terutama ketika file (sekarang di Git) berasal dari sistem yang kompatibel dengan RCS (CVS).
Kata kunci seperti itu mungkin menarik jika sumber didistribusikan secara terpisah dari repositori Git mana pun (itulah yang juga saya lakukan). Solusi saya seperti ini:
Setiap proyek memiliki direktori sendiri, dan di root proyek saya memiliki file teks bernama
.version
konten yang menjelaskan versi saat ini (nama yang akan digunakan saat mengekspor sumber).Saat bekerja untuk rilis berikutnya, skrip mengekstrak
.version
nomor itu, beberapa deskriptor versi Git (sepertigit describe
) dan nomor versi monotonik dalam.build
(plus host dan tanggal) ke file sumber yang dibuat secara otomatis yang ditautkan ke program akhir, sehingga Anda dapat menemukannya keluar dari sumber apa dan kapan dibangun.Saya mengembangkan fitur baru di cabang terpisah, dan hal pertama yang saya lakukan adalah menambahkan
n
(untuk "berikutnya") ke.version
string (beberapa cabang yang berasal dari root yang sama akan menggunakan.version
nomor sementara yang sama ). Sebelum rilis saya memutuskan cabang mana yang akan digabungkan (mudah-mudahan semuanya sama.version
). Sebelum melakukan penggabungan, saya memperbarui.version
ke nomor berikutnya (pembaruan besar atau kecil, tergantung pada fitur yang digabungkan).sumber
Jika Anda ingin informasi git commit dapat diakses ke kode Anda, maka Anda harus melakukan langkah pra-build untuk mendapatkannya di sana. Dalam bash untuk C / C ++ mungkin terlihat seperti ini:
prebuild.sh
dengan
version.h
tampilan seperti:Kemudian, di mana pun Anda membutuhkannya dalam kode
#include "version.h"
dan referensi Andagit_tag
ataugit_commit
sesuai kebutuhan.Dan Anda
Makefile
mungkin memiliki sesuatu seperti ini:Ini memiliki manfaat:
Implementasi ini
prepublish.sh
memiliki kekurangan:git_tag
/git_commit
tidak berubah.git describe --tags --always --dirty
untuk menangkap kasus penggunaan itu.Seorang pelamun
prebuild.sh
yang bisa menghindari masalah ini dibiarkan sebagai latihan bagi pembaca.sumber
Saya setuju dengan mereka yang berpikir bahwa penggantian token adalah milik alat build daripada alat kontrol versi.
Anda harus memiliki beberapa alat rilis otomatis untuk menyetel ID versi di sumber Anda pada saat rilis diberi tag.
sumber
Nama tag dan informasi terkait lainnya sekarang dapat diedit langsung ke dalam file secara otomatis oleh Git melalui
export-subst
fiturgitattributes(5)
. Ini tentu saja membutuhkan penggunaangit archive
untuk membuat rilis, dan hanya dalam file tar yang dihasilkan hasil edit substitusi akan terlihat.Misalnya di
.gitattributes
file letakkan baris berikut:Kemudian di file sumber Anda dapat menambahkan baris seperti ini:
Dan itu akan meluas hingga terlihat seperti ini dalam rilis yang dibuat oleh, misalnya
git archive v1.2.0.90
,:sumber
Karena Anda menggunakan Emacs, Anda mungkin beruntung :)
Saya telah menemukan pertanyaan ini secara kebetulan, dan juga secara kebetulan saya datang ke Lively beberapa hari yang lalu, sebuah paket Emacs yang memungkinkan adanya potongan-potongan Emacs Lisp yang hidup dalam dokumen Anda. Sejujurnya saya belum mencobanya, tetapi hal itu muncul di benak saya ketika membaca ini.
sumber
Saya juga berasal dari SCCS, RCS, dan CVS (
%W% %G% %U%
).Saya memiliki tantangan serupa. Saya ingin tahu versi kode apa yang ada di sistem mana pun yang menjalankannya. Sistem mungkin atau mungkin tidak terhubung ke jaringan manapun. Sistem mungkin atau mungkin tidak menginstal Git. Sistem mungkin atau mungkin tidak menginstal repositori GitHub di dalamnya.
Saya menginginkan solusi yang sama untuk beberapa jenis kode (.sh, .go, .yml, .xml, dll). Saya ingin setiap orang yang tidak memiliki pengetahuan tentang Git atau GitHub dapat menjawab pertanyaan "Versi apa yang Anda jalankan?"
Jadi, saya menulis apa yang saya sebut pembungkus di sekitar beberapa perintah Git. Saya menggunakannya untuk menandai file dengan nomor versi dan beberapa informasi. Itu memecahkan tantangan saya. Ini dapat membantu Anda.
https://github.com/BradleyA/markit
sumber
Untuk mengatasi masalah ini sendiri, saya membuat "retasan" kecil sebagai kait pasca-komit:
Lebih detail didokumentasikan dalam posting ini di blog saya .
sumber