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?
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?
Jawaban:
Anda bisa melihat git describe, yang melakukan sesuatu yang dekat dengan apa yang Anda minta.
--abbrev=0itu harus mengembalikan tag beranotasi terdekat
git describe --exact-match --abbrev=0.
git describe --tagsdan bandingkan tag terakhir com di halaman rilis github
Untuk mendapatkan tag terbaru:
git describe --tags
Untuk mendapatkan tag beranotasi terbaru :
git describe --abbrev=0
git describemengatakan: --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
git describe --tags $(git rev-list --tags --max-count=1)
TAG=$(git describe --tags $(git rev-list --tags --max-count=1))@ william-seekell
Untuk mendapatkan tag terbaru, Anda dapat melakukan:
$ git untuk-masing-masing ref / tag ref --sort = -taggerdate --format = '% (refname)' --count = 1
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.
--sort=-authordatedan --sort=authordate.
--sort=-taggerdate. Untuk tag, authordatedan committerdatekosong (jadi tidak berguna sebagai tombol sortir).
git for-each-ref refs/tags --sort=-taggerdate --format='%(refname:short)' --count=1bahkan lebih baik :)
--points-at=$SHAakan 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.
--tags=<pattern>di rev-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?
git describe ...mengembalikan tag sebelumnya ?!)
--abbrev=0jawaban 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 tag a.
Ini mungkin berbeda tentu saja:
A->B->C->D->E->F (HEAD)
\ \
\ X->Y->Z (v0.2)
P->Q (v0.1)
Bayangkan pengembang tag'ed Zsebagai v0.2hari Senin, dan kemudian tag'ed Qsebagai v0.1Selasa. v0.1adalah yang lebih baru, tetapi v0.2lebih 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..HEADdll untuk setiap tag. Ini memberi Anda jumlah komit pada HEAD karena jalan yang berakhir di v0.2menyimpang 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 describemelakukan 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 describecari tag yang "dapat dijangkau" dari HEAD. Karena itu ia tidak akan menemukan tag seperti v0.2itu yang tidak ada di jalur kembali dari KEPALA, tetapi jalur yang menyimpang dari sana.
git describe --tags
mengembalikan tag terakhir yang dapat dilihat oleh cabang saat ini
git log --tags --no-walk --pretty="format:%d" | sed 2q | sed 's/[()]//g' | sed s/,[^,]*$// | sed 's ...... '
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.
git log --tags --no-walk --pretty="format:%D" | sed -nr '5q;s;^.*(tag: )([^,]*).*;\2;p' di mana %Dtidak termasuk ()karakter sekitarnya , dan sedmulai 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):
$ git log --graph --all --decorate --oneline --simplify-by-decoration
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:
HEADuntuk menggabungkan basis dengan tagHEADdan tagSaya tidak tahu cara menghitung panjang jalur terpendek .
Script bahwa tag semacam menurut tanggal dari dasar penggabungan antara HEADdan tag:
$ git tag \
| while read t; do \
b=`git merge-base HEAD $t`; \
echo `git log -n 1 $b --format=%ai` $t; \
done | sort
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:
$ git tag \
| while read t; do echo `git rev-list --count $t..HEAD` $t; done \
| sort -n
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:
$ git log --tags --simplify-by-decoration --pretty="format:%ci %d" | sort -r
Untuk mengetahui tanggal revisi saat ini, gunakan:
$ git log --max-count=1
Catatan yang git describe --tagsmemiliki 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 HEADdengan yang Anda inginkan!
git tag -l ac* | tail -n1
Dapatkan tag terakhir dengan awalan "ac" . Misalnya, tag dinamai dengan ac1.0.0, atau ac1.0.5. Tag lain yang diberi nama 1.0.0, 1.1.0akan diabaikan.
git tag -l [0-9].* | tail -n1
Dapatkan tag terakhir, karakter siapa yang pertama 0-9. Jadi, tag tersebut dengan char pertama a-zakan diabaikan.
git tag --help # Help for `git tag`
git tag -l <pattern>
Daftar tag dengan nama yang cocok dengan pola yang diberikan (atau semua jika tidak ada pola yang diberikan). Menjalankan "git tag" tanpa argumen juga mencantumkan semua tag. Polanya adalah shell wildcard (yaitu, dicocokkan menggunakan fnmatch (3)). Beberapa pola dapat diberikan; jika ada yang cocok, tag ditampilkan.
tail -n <number> # display the last part of a file
tail -n1 # Display the last item
Dengan git tag --help, tentang sortargumennya. Ini akan digunakan lexicorgraphic ordersecara default, jika tag.sortproperti tidak ada.
Urutkan default pesanan ke nilai yang dikonfigurasikan untuk variabel tag.sort jika ada, atau pesan leksikografis sebaliknya. Lihat git-config (1).
Setelah google, seseorang berkata git 2.8.0 mendukung sintaks berikut.
git tag --sort=committerdate
git tag --sort=committerdate | tail -1
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.
PreviousAndCurrentGitTag=`git describe --tags \`git rev-list --tags --abbrev=0 --max-count=2\` --abbrev=0`
PreviousGitTag=`echo $PreviousAndCurrentGitTag | cut -f 2 -d ' '`
CurrentGitTag=`echo $PreviousAndCurrentGitTag | cut -f 1 -d ' '`
GitLog=`git log ${PreviousGitTag}..${CurrentGitTag} --pretty=oneline | sed "s_.\{41\}\(.*\)_; \1_"`
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.
Pikiran pertama saya adalah Anda dapat menggunakan git rev-list HEAD, yang mencantumkan semua revs dalam urutan kronologis terbalik, dikombinasikan dengan git tag --contains. Ketika Anda menemukan referensi di mana git tag --containsmenghasilkan daftar kosong, Anda telah menemukan tag terbaru.
Jika Anda memerlukan satu liner yang mendapatkan nama tag terbaru (berdasarkan tanggal tag) pada cabang saat ini :
git for-each-ref refs/tags --sort=-taggerdate --format=%(refname:short) --count=1 --points-at=HEAD
Kami menggunakan ini untuk mengatur nomor versi dalam pengaturan.
Contoh keluaran:
v1.0.0
Bekerja di Windows juga.
-bash: syntax error near unexpected token '('
--format="%(refname:short)") dan melewati --points-at=HEADitu berfungsi. Dengan saklar terakhir itu tidak mengembalikan apa-apa, saya kira karena saya HEADtidak ditandai?
HEADtidak 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. Selesai
Sunting: Anda juga dapat memberikan refname yang valid, bahkan jarak jauh; yaitu, git describe origin/masterakan memberi tahu Anda tag terbaru yang dapat dijangkau dari asal / master.
for-each-refperintah ( stackoverflow.com/a/5261470/515973 ) dan kombinasi rev-listdan describe( stackoverflow.com/a/7979255/515973 )
git describe branchname --tagstidak 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
BRANCH=`git rev-parse --abbrev-ref HEAD` && git describe --tags --abbrev=0 $BRANCH^ | grep $BRANCH
Pemimpin cabang:
git checkout master
BRANCH=`git rev-parse --abbrev-ref HEAD` && git describe --tags
--abbrev=0 $BRANCH^ | grep $BRANCH
master-1448
Cabang kustom:
git checkout 9.4
BRANCH=`git rev-parse --abbrev-ref HEAD` && git describe --tags
--abbrev=0 $BRANCH^ | grep $BRANCH
9.4-6
Dan kebutuhan akhir saya untuk meningkatkan dan mendapatkan tag +1 untuk penandaan berikutnya.
BRANCH=`git rev-parse --abbrev-ref HEAD` && git describe --tags --abbrev=0 $BRANCH^ | grep $BRANCH | awk -F- '{print $NF}'
Untuk pertanyaan seperti yang diajukan,
Cara mendapatkan nama tag terbaru di cabang saat ini
kamu ingin
git log --first-parent --pretty=%d | grep -m1 tag:
--first-parentmemberitahu git loguntuk tidak merinci sejarah gabungan, --pretty=%dmengatakan untuk hanya menunjukkan dekorasi yaitu nama lokal untuk setiap komit. grep -m1mengatakan "cocokkan hanya satu", sehingga Anda hanya mendapatkan tag terbaru.
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.
git log --decorate --tags master |grep '^commit'|grep 'tag:.*)$'|awk '{print $NF}'|sed 's/)$//'|head -n 1
Kritik diterima karena saya sekarang akan menggunakan ini :)