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=0
itu harus mengembalikan tag beranotasi terdekat
git describe --exact-match --abbrev=0
.
git describe --tags
dan 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 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
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=-authordate
dan --sort=authordate
.
--sort=-taggerdate
. Untuk tag, authordate
dan committerdate
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.
--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=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 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 Z
sebagai v0.2
hari Senin, dan kemudian tag'ed Q
sebagai v0.1
Selasa. v0.1
adalah yang lebih baru, tetapi v0.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 di v0.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 seperti v0.2
itu 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 %D
tidak termasuk ()
karakter sekitarnya , dan sed
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):
$ 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:
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:
$ 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 --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!
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.0
akan diabaikan.
git tag -l [0-9].* | tail -n1
Dapatkan tag terakhir, karakter siapa yang pertama 0-9
. Jadi, tag tersebut dengan char pertama a-z
akan 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 sort
argumennya. Ini akan digunakan lexicorgraphic order
secara default, jika tag.sort
properti 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 --contains
menghasilkan 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=HEAD
itu berfungsi. Dengan saklar terakhir itu tidak mengembalikan apa-apa, saya kira karena saya HEAD
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
. Selesai
Sunting: 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.
for-each-ref
perintah ( stackoverflow.com/a/5261470/515973 ) dan kombinasi rev-list
dan describe
( 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
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-parent
memberitahu git 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.
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 :)