Apa cara paling sederhana untuk mendapatkan tag terbaru di Git?
git tag a HEAD
git tag b HEAD^^
git tag c HEAD^
git tag
keluaran:
a
b
c
Haruskah saya menulis skrip untuk mendapatkan datetime setiap tag dan membandingkannya?
git
git-checkout
git-tag
getlatest
culebrón
sumber
sumber
Jawaban:
Anda bisa melihat
git describe
, yang melakukan sesuatu yang dekat dengan apa yang Anda minta.sumber
--abbrev=0
itu harus mengembalikan tag beranotasi terdekatgit describe --exact-match --abbrev=0
.git describe --tags
dan bandingkan tag terakhir com di halaman rilis githubUntuk mendapatkan tag terbaru:
Untuk mendapatkan tag beranotasi terbaru :
sumber
git describe
mengatakan:--abbrev=<n> [...] An <n> of 0 will suppress long format, only showing the closest tag.
git describe --tags
git checkout $(git describe --abbrev=0 --tags)
Akan menampilkan tag komit yang ditandai terbaru di semua cabang
sumber
TAG=$(git describe --tags $(git rev-list --tags --max-count=1))
@ william-seekellUntuk mendapatkan tag terbaru, Anda dapat melakukan:
Tentu saja, Anda dapat mengubah argumen hitung atau mengurutkan bidang yang diinginkan. Tampaknya Anda mungkin bermaksud mengajukan pertanyaan yang sedikit berbeda, tetapi ini menjawab pertanyaan saat saya menafsirkannya.
sumber
--sort=-authordate
dan--sort=authordate
.--sort=-taggerdate
. Untuk tag,authordate
dancommitterdate
kosong (jadi tidak berguna sebagai tombol sortir).git for-each-ref refs/tags --sort=-taggerdate --format='%(refname:short)' --count=1
bahkan lebih baik :)--points-at=$SHA
akan memberi Anda tag untuk hash komit.Bagaimana dengan ini?
TAG=$(git describe $(git rev-list --tags --max-count=1))
Secara teknis, Anda tidak akan selalu mendapatkan tag terbaru, tetapi komit terbaru yang ditandai, yang mungkin atau mungkin bukan hal yang Anda cari.
sumber
--tags=<pattern>
direv-list
. Misalnya, dapatkan tag versi terakhirgit describe --tags $(git rev-list --tags='v[0-9].[0-9]*' --max-count=1)
git describe --tags $(git rev-list --tags --max-count=1)
Anda dapat menjalankan:
git describe --tags $(git rev-list --tags --max-count=1)
bicarakan di sini: Cara mendapatkan nama tag terbaru?sumber
git describe ...
mengembalikan tag sebelumnya ?!)--abbrev=0
jawaban dan mereka memotong bagian dari tag yang saya inginkan."Paling baru" bisa memiliki dua arti dalam hal git.
Anda dapat mengartikan, "tag mana yang memiliki tanggal pembuatan terbaru", dan sebagian besar jawaban di sini adalah untuk pertanyaan itu. Dalam hal pertanyaan Anda, Anda ingin mengembalikan tag
c
.Atau Anda bisa berarti "tag mana yang paling dekat dalam sejarah pengembangan dengan beberapa cabang bernama", biasanya cabang tempat Anda berada
HEAD
,. Dalam pertanyaan Anda, ini akan mengembalikan taga
.Ini mungkin berbeda tentu saja:
Bayangkan pengembang tag'ed
Z
sebagaiv0.2
hari Senin, dan kemudian tag'edQ
sebagaiv0.1
Selasa.v0.1
adalah yang lebih baru, tetapiv0.2
lebih dekat dalam sejarah pengembangan ke HEAD, dalam arti bahwa jalan itu dimulai pada titik yang lebih dekat ke HEAD.Saya pikir Anda biasanya menginginkan jawaban kedua ini, lebih dekat dalam sejarah pembangunan. Anda dapat menemukannya dengan menggunakan
git log v0.2..HEAD
dll untuk setiap tag. Ini memberi Anda jumlah komit pada HEAD karena jalan yang berakhir div0.2
menyimpang dari jalan diikuti oleh HEAD.Berikut ini adalah skrip Python yang melakukan itu dengan mengulangi semua tag yang menjalankan pemeriksaan ini, dan kemudian mencetak tag dengan komit paling sedikit di HEAD karena jalur tag berbeda:
https://github.com/MacPython/terryfy/blob/master/git-closest-tag
git describe
melakukan sesuatu yang sedikit berbeda, yaitu melacak kembali dari (misalnya) KEPALA untuk menemukan tag pertama yang ada di jalur kembali dalam sejarah dari KEPALA. Dalam istilah git,git describe
cari tag yang "dapat dijangkau" dari HEAD. Karena itu ia tidak akan menemukan tag sepertiv0.2
itu yang tidak ada di jalur kembali dari KEPALA, tetapi jalur yang menyimpang dari sana.sumber
git describe --tags
mengembalikan tag terakhir yang dapat dilihat oleh cabang saat ini
sumber
JIKA ANDA PERLU LEBIH DARI SATU TAG TERAKHIR
(git jelaskan - tag terkadang memberikan hash yang salah, saya tidak tahu kenapa, tapi bagi saya --max-count 2 tidak berfungsi)
ini adalah bagaimana Anda bisa mendapatkan daftar dengan 2 nama tag terbaru dalam urutan kronologis terbalik, berfungsi dengan baik di git 1.8.4. Untuk versi git yang lebih lama (seperti 1.7. *), Tidak ada string "tag:" dalam keluaran - hapus saja panggilan terakhir
Jika Anda menginginkan lebih dari 2 tag terbaru - ubah "sed 2q" menjadi "sed 5q" atau apa pun yang Anda butuhkan
Kemudian Anda dapat dengan mudah menguraikan setiap nama tag ke variabel atau lebih.
sumber
git log --tags --no-walk --pretty="format:%D" | sed -nr '5q;s;^.*(tag: )([^,]*).*;\2;p'
di mana%D
tidak termasuk()
karakter sekitarnya , dansed
mulai 5q meninggalkan 4 baris sebelum 5, kemudian mencetak semua karakter antara 'tag: `dan yang pertama', '. Jadi ... dengan asumsi tidak ada koma yang digunakan di dalam tag, ini berfungsi dengan baik.Apa yang salah dengan semua saran (kecuali penjelasan Matthew Brett , terbaru dari posting jawaban ini)?
Jalankan saja perintah apa pun yang disediakan oleh orang lain pada riwayat jQuery Git ketika Anda pada titik riwayat yang berbeda dan periksa hasilnya dengan representasi riwayat pemberian tag visual (saya melakukan itu sebabnya Anda melihat posting ini):
Saat ini banyak proyek yang melakukan rilis (dan penandaan) di cabang terpisah dari jalur utama .
Ada alasan kuat untuk ini. Lihat saja proyek JS / CSS yang sudah mapan. Untuk konvensi pengguna, mereka membawa file rilis biner / yang diperkecil dalam DVCS. Secara alami sebagai pengelola proyek Anda tidak ingin membuang sejarah diff arus utama Anda dengan gumpalan biner yang tidak berguna dan melakukan komit dari pembuatan artefak di luar jalur utama .
Karena Git menggunakan DAG dan bukan sejarah linear - sulit untuk mendefinisikan metrik jarak sehingga kita dapat mengatakan - oh rev itu yang paling dekat dengan saya
HEAD
!Saya memulai perjalanan saya sendiri (lihat ke dalam, saya tidak menyalin gambar bukti mewah ke posting panjang ini):
Apa tag terdekat di masa lalu sehubungan dengan percabangan di Git?
Saat ini saya memiliki 4 definisi jarak antara tag dan revisi yang masuk akal dengan menurunnya kegunaan:
HEAD
untuk menggabungkan basis dengan tagHEAD
dan tagSaya tidak tahu cara menghitung panjang jalur terpendek .
Script bahwa tag semacam menurut tanggal dari dasar penggabungan antara
HEAD
dan tag:Ini dapat digunakan pada sebagian besar proyek.
Script yang mengurutkan tag berdasarkan jumlah revs yang dapat dijangkau dari HEAD tetapi tidak dapat dijangkau dari tag:
Jika riwayat proyek Anda memiliki tanggal yang aneh pada komitmen (karena rebases atau penulisan ulang riwayat lain atau orang bodoh lupa untuk mengganti baterai BIOS atau sihir lain yang Anda lakukan pada riwayat) gunakan skrip di atas.
Untuk opsi terakhir ( tanggal tag terlepas dari basis gabungan ) untuk mendapatkan daftar tag yang diurutkan berdasarkan tanggal gunakan:
Untuk mengetahui tanggal revisi saat ini, gunakan:
Catatan yang
git describe --tags
memiliki penggunaan pada kasus sendiri tetapi tidak untuk menemukan tag yang diharapkan manusia terdekat dalam sejarah proyek .CATATAN Anda dapat menggunakan resep di atas pada revisi apa pun, cukup ganti
HEAD
dengan yang Anda inginkan!sumber
git describe --abbrev=0 --tags
Jika Anda tidak melihat tag terbaru, pastikan untuk mengambil asal sebelum menjalankan itu:
git remote update
sumber
Dapatkan tag terakhir dengan awalan "ac" . Misalnya, tag dinamai dengan
ac1.0.0
, atauac1.0.5
. Tag lain yang diberi nama1.0.0
,1.1.0
akan diabaikan.Dapatkan tag terakhir, karakter siapa yang pertama
0-9
. Jadi, tag tersebut dengan char pertamaa-z
akan diabaikan.Info lebih lanjut
Memperbarui
Dengan
git tag --help
, tentangsort
argumennya. Ini akan digunakanlexicorgraphic order
secara default, jikatag.sort
properti tidak ada.Setelah google, seseorang berkata git 2.8.0 mendukung sintaks berikut.
sumber
sumber
Berikut ini berfungsi untuk saya jika Anda perlu dua tag terakhir (misalnya, untuk menghasilkan log perubahan antara tag saat ini dan tag sebelumnya). Saya telah mengujinya hanya dalam situasi di mana tag terbaru adalah
HEAD
.Itu sesuai dengan kebutuhan saya, tetapi karena saya bukan penyihir git, saya yakin itu bisa lebih ditingkatkan. Saya juga menduga itu akan pecah jika sejarah komit bergerak maju. Saya hanya berbagi kalau-kalau itu membantu seseorang.
sumber
Pikiran pertama saya adalah Anda dapat menggunakan
git rev-list HEAD
, yang mencantumkan semua revs dalam urutan kronologis terbalik, dikombinasikan dengangit tag --contains
. Ketika Anda menemukan referensi di managit tag --contains
menghasilkan daftar kosong, Anda telah menemukan tag terbaru.sumber
Jika Anda ingin menemukan tag terakhir yang diterapkan pada cabang tertentu, Anda dapat mencoba yang berikut:
sumber
Jika Anda memerlukan satu liner yang mendapatkan nama tag terbaru (berdasarkan tanggal tag) pada cabang saat ini :
Kami menggunakan ini untuk mengatur nomor versi dalam pengaturan.
Contoh keluaran:
Bekerja di Windows juga.
sumber
-bash: syntax error near unexpected token '('
--format="%(refname:short)"
) dan melewati--points-at=HEAD
itu berfungsi. Dengan saklar terakhir itu tidak mengembalikan apa-apa, saya kira karena sayaHEAD
tidak ditandai?HEAD
tidak ditandai.Ini adalah utas lama, tetapi tampaknya banyak orang kehilangan jawaban yang paling sederhana, termudah, dan paling benar untuk pertanyaan OP: untuk mendapatkan tag terbaru untuk cabang saat ini , yang Anda gunakan
git describe HEAD
. SelesaiSunting: Anda juga dapat memberikan refname yang valid, bahkan jarak jauh; yaitu,
git describe origin/master
akan memberi tahu Anda tag terbaru yang dapat dijangkau dari asal / master.sumber
for-each-ref
perintah ( stackoverflow.com/a/5261470/515973 ) dan kombinasirev-list
dandescribe
( stackoverflow.com/a/7979255/515973 )git describe branchname --tags
tidak berfungsi bagi saya untuk mendapatkan tag terbaru pada cabang (git versi 2.12.2)Untuk mendapatkan tag terbaru hanya pada cabang / nama tag saat ini yang diawali dengan cabang saat ini, saya harus menjalankan yang berikut
Dan kebutuhan akhir saya untuk meningkatkan dan mendapatkan tag +1 untuk penandaan berikutnya.
sumber
Untuk pertanyaan seperti yang diajukan,
kamu ingin
--first-parent
memberitahugit log
untuk tidak merinci sejarah gabungan,--pretty=%d
mengatakan untuk hanya menunjukkan dekorasi yaitu nama lokal untuk setiap komit.grep -m1
mengatakan "cocokkan hanya satu", sehingga Anda hanya mendapatkan tag terbaru.sumber
jika tag Anda dapat diurutkan:
sumber
Tidak banyak menyebutkan tag yang tidak ditandai vs yang dianotasi di sini. 'jelaskan' berfungsi pada tag beranotasi dan mengabaikan yang tidak ditandai.
Ini jelek tapi apakah pekerjaan yang diminta dan tidak akan menemukan tag pada cabang lain (dan bukan pada yang ditentukan dalam perintah: master dalam contoh di bawah ini)
Pemfilteran harus dioptimalkan (dikonsolidasikan), tetapi sekali lagi, ini sepertinya berhasil.
Kritik diterima karena saya sekarang akan menggunakan ini :)
sumber
Cara mudah lain untuk mendapatkan nama tag terbaru adalah dengan
atau
untuk menyimpannya dalam variabel.
git tag
daftar semua tag yang tersedia dan akan mengembalikan baris terakhir jika hasilnya.tail
-1
sumber