Kami menggunakan SVN di tempat kerja, tetapi untuk proyek pribadi saya, saya memutuskan untuk menggunakan Git. Jadi saya menginstal Git kemarin, dan saya ingin tahu apa yang setara dengan angka revisi di Git .
Katakanlah kita bekerja pada versi 3.0.8 dan setiap perbaikan bug memiliki nomor revisi sendiri yang dapat kita gunakan ketika kita berbicara tentang perbaikan bug ini. Jadi jika saya memberi tag kode di Git ke 3.0.8 lalu apa yang bisa saya gunakan sebagai nomor revisi atau jenis identifikasi yang lebih rinci? Saya menemukan hash tidak begitu ramah pengguna untuk manusia.
Jawaban:
Kabar baik atau buruk untuk Anda, hash ADALAH nomor revisi. Saya juga mengalami masalah dengan ini ketika saya beralih dari SVN ke git.
Anda dapat menggunakan "pemberian tag" di git untuk menandai revisi tertentu sebagai "rilis" untuk versi tertentu, membuatnya mudah untuk merujuk pada revisi itu. Lihat posting blog ini .
Hal utama yang harus dipahami adalah git tidak dapat memiliki angka revisi - pikirkan tentang sifat desentralisasi. Jika pengguna A dan B keduanya berkomitmen untuk repositori lokal mereka, bagaimana bisa git secara wajar menetapkan nomor revisi berurutan? A tidak memiliki pengetahuan tentang B sebelum mereka mendorong / menarik perubahan satu sama lain.
Hal lain yang perlu dilihat adalah percabangan disederhanakan untuk cabang bugfix:
Mulai dengan rilis: 3.0.8. Kemudian, setelah rilis itu, lakukan ini:
Ini akan membuat cabang untuk perbaikan bug. Periksa cabang:
Sekarang buat perubahan bug apa pun yang Anda inginkan.
Komit mereka, dan kembali ke cabang utama:
Kemudian tarik perubahan-perubahan itu dari cabang lain:
Dengan begitu, Anda memiliki cabang bugfix khusus rilis terpisah, tetapi Anda masih menarik perubahan bugfix ke trunk dev utama Anda.
sumber
fixed in 547cc3e..c4b2eba
, dan Anda memiliki beberapa revisi lain, Anda tidak tahu apakah kode Anda seharusnya berisi perbaikan ?! Tentunya para git di git-central punya solusi untuk ini?!?!Dengan Git modern (1.8.3.4 dalam kasus saya) dan tidak menggunakan cabang, Anda dapat melakukannya:
sumber
git rev-list --count --first-parent HEAD
git rev-list --count HEAD
tergantung pada kapan dorongan dan tarikan terakhir dilakukan.--first-parent
alamat perhatian Anda? Aku benci untuk menghindari solusi yang tampaknya paling sederhana karena kasus tepi yang langka jika ada solusi atau cara yang sama-sederhana untuk membuatnya lebih kuat.--first-parent
bantu. Selama tidak ada rebasing yang dilakukan dan cabang yang sama selalu digunakan untuk membuat rilis (dan menghitung nomor rilis ini, tentu saja), saya pikir ini bisa digunakan. Meskipun, saya masih ragu itu akan selalu mengidentifikasi secara unik komit yang berasal dari rilis. Ada begitu banyak hal yang bisa salah di sini ... tetapi saat ini saya tidak dapat memikirkan sesuatu yang pasti akan mematahkan ini (mengingat pernyataan saya di atas "selama"). Thegit describe
metode yang disebutkan dalam jawaban lain adalah cara untuk pergi. Buat tag jika Anda ingin sesuatu yang dapat dibaca manusia.The
git describe
Perintah menciptakan nama yang dapat dibaca sedikit lebih manusia yang mengacu pada tertentu komit. Misalnya, dari dokumentasi:Selama Anda menggunakan tag dengan nama yang masuk akal untuk menandai rilis tertentu, ini dapat dianggap kira-kira setara dengan "nomor revisi" SVN.
sumber
git
repositori Anda sudah memiliki tag; jika tidak, Anda mungkin mendapatkan git uraikan gagal dengan "fatal: Tidak ada nama yang ditemukan, tidak dapat menggambarkan apa pun." - Stack Overflow ; artinya Anda harus membuat tag sendiri.git describe
tidak pernah gagal, gunakangit describe --always
opsi.git describe
digunakan untuk menemukan sumber melakukan, entah bagaimana? Pendek menghitung secara manual komit dalam log, maksud saya.v1.0.4
) dan id komit terbaru (2414721
) sudah menjadi bagian dari git yang menggambarkan output.Poster-poster lainnya benar, tidak ada "nomor revisi".
Saya pikir cara terbaik adalah menggunakan Tag untuk "rilis"!
Tapi saya menggunakan yang berikut ini untuk angka revisi palsu (hanya untuk klien melihat revisi dan kemajuan, karena mereka ingin memiliki revisi peningkatan yang sama dari git seperti yang mereka gunakan dengan subversi).
Perlihatkan "revisi saat ini" dari "KEPALA" disimulasikan dengan menggunakan ini:
git rev-list HEAD | wc -l
Tetapi bagaimana jika klien memberi tahu saya bahwa ada bug dalam "revisi" 1302?
Untuk ini saya menambahkan yang berikut ke bagian [alias] dari ~ / .gitconfig saya:
show-rev-number = !sh -c 'git rev-list --reverse HEAD | nl | awk \"{ if(\\$1 == "$0") { print \\$2 }}\"'
menggunakan
git show-rev-number 1302
kemudian akan mencetak hash untuk "revisi" :)Saya membuat Posting Blog (dalam bahasa Jerman) tentang "teknik" itu beberapa waktu lalu.
sumber
git bisect
(tautan) adalah alat yang tepat untuk mengidentifikasi apa yang berubah ketika oleh siapa.git rev-list --reverse HEAD | awk "{ print NR }" | tail -n 1
Git tidak memiliki konsep angka revisi yang sama dengan subversi. Sebaliknya setiap snapshot yang diberikan dibuat dengan komit ditandai oleh checksum SHA1. Mengapa? Ada beberapa masalah dengan revno yang berjalan di sistem kontrol versi terdistribusi:
Pertama, karena pengembangan tidak linier sama sekali, lampiran nomor agak sulit sebagai masalah untuk dipecahkan dengan cara yang akan memenuhi kebutuhan Anda sebagai seorang programmer. Mencoba memperbaikinya dengan menambahkan nomor mungkin dengan cepat menjadi bermasalah ketika nomor tersebut tidak berperilaku seperti yang Anda harapkan.
Kedua, angka revisi dapat dihasilkan pada mesin yang berbeda. Ini membuat sinkronisasi angka menjadi lebih sulit - terutama karena konektivitas bersifat satu arah; Anda bahkan mungkin tidak memiliki akses ke semua mesin yang memiliki repositori.
Ketiga, dalam git, agak dipelopori oleh sistem OpenCM yang sekarang sudah tidak ada, identitas dari sebuah commit (apa itu commit) setara dengan namanya (id SHA). Ini penamaan = identitas konsep yang sangat kuat. Saat Anda duduk dengan nama komit di tangan, komit juga mengidentifikasi komit dengan cara yang tidak bisa dikalahkan. Ini pada gilirannya memungkinkan Anda memeriksa semua komit Anda kembali ke yang pertama awal untuk korupsi dengan
git fsck
perintah.Sekarang, karena kami memiliki DAG (Grafik Acyclic yang Diarahkan) dari revisi dan ini merupakan pohon saat ini, kami membutuhkan beberapa alat untuk menyelesaikan masalah Anda : Bagaimana kami membedakan versi yang berbeda. Pertama, Anda dapat menghilangkan bagian dari hash jika awalan yang diberikan, 1516bd katakan, secara unik mengidentifikasi komit Anda. Tapi ini juga agak dibuat-buat. Sebaliknya, caranya adalah dengan menggunakan tag dan atau cabang. Tag atau cabang mirip dengan "catatan tempel kuning" yang Anda lampirkan ke kom-SHA1-id yang diberikan. Tag, pada dasarnya, dimaksudkan untuk tidak bergerak sedangkan cabang akan bergerak ketika komit baru dibuat untuk KEPALA nya. Ada beberapa cara untuk merujuk komit di sekitar tag atau cabang, lihat halaman manual git-rev-parse.
Biasanya, jika Anda perlu mengerjakan bagian kode tertentu, bagian itu sedang mengalami perubahan dan harus menjadi cabang dengan nama topik yang disebutkan. Menciptakan banyak cabang (20-30 per programmer tidak pernah terdengar, dengan beberapa 4-5 diterbitkan untuk dikerjakan oleh orang lain) adalah trik untuk git yang efektif. Setiap karya harus dimulai sebagai cabangnya sendiri dan kemudian digabung saat diuji. Cabang-cabang yang tidak diterbitkan dapat ditulis ulang seluruhnya dan bagian dari menghancurkan sejarah ini adalah kekuatan git.
Ketika perubahan diterima menjadi master itu agak membeku dan menjadi arkeologi. Pada titik itu, Anda dapat menandai itu, tetapi lebih sering referensi ke komit tertentu dibuat dalam pelacak bug atau pelacak masalah melalui jumlah sha1. Tag cenderung dicadangkan untuk gundukan versi dan titik cabang untuk cabang pemeliharaan (untuk versi lama).
sumber
Jika Anda tertarik, saya mengatur nomor versi secara otomatis dari git infos di sini dalam format
di mana build adalah jumlah total komitmen. Anda akan melihat kode menarik di
Makefile
. Inilah bagian yang relevan untuk mengakses bagian yang berbeda dari nomor versi:sumber
Fungsi Bash:
menghasilkan sesuatu seperti
Itu adalah
sumber
The SHA1 hash dari komit adalah setara dengan nomor revisi Subversion.
sumber
Inilah yang saya lakukan di makefile saya berdasarkan solusi orang lain. Catatan tidak hanya memberi kode Anda nomor revisi, tetapi juga menambahkan hash yang memungkinkan Anda untuk membuat ulang rilis.
sumber
git-describe
untuk menghindari kesalahan, adalah dengangit describe --always --dirty --long --tags
yang berfungsi dalam semua kasus yang dapat saya pikirkan.Masalah dengan menggunakan hash git sebagai nomor build adalah bahwa itu tidak meningkat secara monoton. OSGi menyarankan menggunakan cap waktu untuk nomor build. Sepertinya jumlah komit ke cabang bisa digunakan sebagai pengganti nomor perubahan subversi atau terpaksa.
sumber
Saya menulis beberapa utilitas PowerShell untuk mengambil informasi versi dari Git dan menyederhanakan penandaan
fungsi: Get-LastVersion, Get-Revisi, Get-NextMajorVersion, Get-NextMinorVersion, TagNextMajorVersion, TagNextMinorVersion:
sumber
Setiap komit memiliki hash yang unik. Selain itu tidak ada angka revisi di git. Anda harus menandai komitmen sendiri jika Anda ingin lebih ramah pengguna.
sumber
Saya hanya ingin mencatat pendekatan lain yang mungkin - dan itu adalah dengan menggunakan
git
git-note (1) , yang ada sejak v 1.6.6 ( Note to Self - Git ) (Saya menggunakangit
versi 1.7.9.5).Pada dasarnya, saya dulu
git svn
mengkloning repositori SVN dengan histori linier (tanpa tata letak standar, tanpa cabang, tanpa tag), dan saya ingin membandingkan angka revisi digit
repositori yang dikloning . Klon git ini tidak memiliki tag secara default, jadi saya tidak bisa menggunakangit describe
. Strategi di sini kemungkinan hanya akan bekerja untuk sejarah linier - tidak yakin bagaimana hasilnya dengan penggabungan dll .; tapi inilah strategi dasarnya:git rev-list
daftar semua riwayat komitrev-list
secara default dalam "urutan kronologis terbalik", kami akan menggunakan--reverse
sakelar untuk mendapatkan daftar komit yang diurutkan berdasarkan yang terlama terlebih dahulubash
shell untukgit log
dengan--notes
, yang juga akan membuang catatan komit, yang dalam hal ini akan menjadi "nomor revisi"git status
)Pertama, mari kita catat yang
git
memiliki lokasi default catatan - tetapi Anda juga dapat menentukanref
(erence) untuk catatan - yang akan menyimpannya di direktori berbeda di bawah.git
; misalnya, saat berada digit
folder repo, Anda dapat menelepongit notes get-ref
untuk melihat direktori apa yang akan:Hal yang perlu diperhatikan adalah bahwa jika Anda
notes add
dengan--ref
, Anda juga harus kemudian menggunakan referensi itu lagi - jika tidak, Anda mungkin mendapatkan kesalahan seperti " Tidak ditemukan catatan untuk objek XXX ... ".Untuk contoh ini, saya telah memilih untuk memanggil
ref
catatan "linrev" (untuk revisi linear) - ini juga berarti tidak mungkin prosedur akan mengganggu catatan yang sudah ada. Saya juga menggunakan--git-dir
saklar, karena menjadigit
pemula, saya memiliki beberapa masalah memahaminya - jadi saya ingin "mengingat nanti":)
; dan saya juga gunakan--no-pager
untuk menekan pemijahanless
saat menggunakangit log
.Jadi, dengan asumsi Anda berada di direktori, dengan subfolder
myrepo_git
yang merupakangit
repositori; yang bisa dilakukan:Jadi, setidaknya dalam kasus khusus saya tentang riwayat linear penuh tanpa cabang, angka revisi tampaknya cocok dengan pendekatan ini - dan tambahan, tampaknya pendekatan ini akan memungkinkan penggunaan
git log
dengan rentang revisi, sambil tetap mendapatkan angka revisi yang tepat - YMMV dengan konteks yang berbeda, meskipun ...Semoga ini bisa membantu seseorang,
Ceria!
EDIT: Ok, ini dia sedikit lebih mudah, dengan
git
alias untuk loop di atas, dipanggilsetlinrev
danunsetlinrev
; ketika di folder repositori git Anda, lakukan ( Perhatikanbash
pelolosan jahat , lihat juga # 16136745 - Tambahkan alias Git yang mengandung tanda titik koma ):... jadi Anda bisa memohon
git setlinrev
sebelum mencoba melakukan log yang melibatkan catatan revisi linear; dangit unsetlinrev
untuk menghapus catatan itu setelah selesai; contoh dari dalam direktori git repo:Waktu yang dibutuhkan shell untuk menyelesaikan alias ini, akan tergantung pada ukuran riwayat repositori.
sumber
Untuk orang-orang yang memiliki proses pembuatan Semut , Anda dapat menghasilkan nomor versi untuk proyek di git dengan target ini:
Hasilnya terlihat seperti ini:
Bendera kotor ada di sini ketika Anda memiliki file yang tidak dikomit ketika Anda menghasilkan nomor versi. Karena biasanya, ketika Anda membangun / mengemas aplikasi Anda, setiap modifikasi kode harus ada di repositori.
sumber
Seiring dengan id SHA-1 dari komit, tanggal dan waktu waktu server akan membantu?
Sesuatu seperti ini:
sumber
Dari manual Git, tag adalah jawaban yang brilian untuk masalah ini:
Lihat 2.6 Dasar-Dasar Git - Penandaan
sumber
By default, the git push command doesn’t transfer tags to remote servers.
Kami menggunakan perintah ini untuk mendapatkan versi dan revisi dari git:
Ia kembali
gcc7b71f
)v2.1.0
, digunakan untuk rilis)v5.3.0-88-gcc7b71f
)v5.3.0-88-gcc7b71f-dirty
)Lihat juga: https://www.git-scm.com/docs/git-describe#Documentation/git-describe.txt
sumber
Acara posting membangun untuk Visual Studio
sumber
Pertimbangkan untuk menggunakannya
git-rev-label
Memberikan informasi tentang revisi repositori Git dalam format seperti
master-c73-gabc6bec
. Dapat mengisi string atau file template dengan variabel lingkungan dan informasi dari Git. Berguna untuk memberikan informasi tentang versi program: cabang, tag, komit hash, jumlah komit, status kotor, tanggal dan waktu. Salah satu hal yang paling berguna adalah hitungan komit, tidak memperhitungkan cabang gabungan - hanya orang tua pertama.sumber