Git'te en son etiketi almanın en basit yolu nedir?
git tag a HEAD
git tag b HEAD^^
git tag c HEAD^
git tag
çıktı:
a
b
c
Her etiketin tarih saatini almak ve karşılaştırmak için bir komut dosyası yazmalı mıyım?
Git'te en son etiketi almanın en basit yolu nedir?
git tag a HEAD
git tag b HEAD^^
git tag c HEAD^
git tag
çıktı:
a
b
c
Her etiketin tarih saatini almak ve karşılaştırmak için bir komut dosyası yazmalı mıyım?
Yanıtlar:
İstediğinize git describe
yakın bir şey yapan bir göz atabilirsiniz .
--abbrev=0
birlikte en yakın açıklamalı etiketi döndürmelidir
git describe --exact-match --abbrev=0
.
git describe --tags
ve com son etiketi github sürüm sayfasında karşılaştırın
En son etiketi almak için:
git describe --tags
En son açıklamalı etiketi almak için :
git describe --abbrev=0
git describe
söylediği gibi: --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)
Tüm şubelerdeki en son etiketli taahhüdün etiketini çıktılar
git describe --tags $(git rev-list --tags --max-count=1)
TAG=$(git describe --tags $(git rev-list --tags --max-count=1))
@ william-pursell
En son etiketi almak için şunları yapabilirsiniz:
$ git for-each-ref refs / tags --sort = -taggerdate --format = '% (refname)' - sayı = 1
Tabii ki, sayma bağımsız değişkenini veya sıralama alanını istediğiniz gibi değiştirebilirsiniz. Görünüşe göre biraz farklı bir soru sormak isteyebilirsiniz, ama bu soruyu yorumladığım gibi cevaplıyor.
--sort=-authordate
ve hem de aynı sırayla üretiliyor --sort=authordate
.
--sort=-taggerdate
. Etiketler için authordate
ve committerdate
boş (sıralama tuşları kadar işe yaramaz).
git for-each-ref refs/tags --sort=-taggerdate --format='%(refname:short)' --count=1
daha da iyi :)
--points-at=$SHA
size bir karma karması etiketi verecektir.
Buna ne dersin?
TAG=$(git describe $(git rev-list --tags --max-count=1))
Teknik olarak, size mutlaka en son etiketi almaz, ancak aradığınız şey olabilir veya olmayabilir etiketli en son taahhüt.
--tags=<pattern>
içinde rev-list
. Örneğin, son sürüm etiketini alıngit describe --tags $(git rev-list --tags='v[0-9].[0-9]*' --max-count=1)
git describe --tags $(git rev-list --tags --max-count=1)
Yürütebilirsiniz: git describe --tags $(git rev-list --tags --max-count=1)
burada konuştuk: En son etiket adı nasıl alınır?
git describe ...
bir önceki etiketi döndürür ?!)
--abbrev=0
cevapları denedim ve istediğim etiketin bir kısmını kesti.
"En yeni" nin git anlamında iki anlamı olabilir.
"Hangi etiketin oluşturulma tarihi en geç zamanda vardır" anlamına gelebilir ve buradaki yanıtların çoğu bu soru içindir. Sorunuz açısından etiketi iade etmek istersiniz c
.
Ya da "hangi etiketin geliştirme geçmişinde adlandırılmış bir şubeye en yakın olduğunu", genellikle bulunduğunuz dalı, yani HEAD
. Sorunuzda bu, etiket döndürür a
.
Bunlar elbette farklı olabilir:
A->B->C->D->E->F (HEAD)
\ \
\ X->Y->Z (v0.2)
P->Q (v0.1)
Geliştirici tag'ed Imagine Z
olarak v0.2
Pazartesi günü, ardından tag'ed Q
olarak v0.1
Salı günü. v0.1
daha yeni olmakla birlikte v0.2
, kalkınma tarihinde HEAD'e daha yakındır, yani üzerinde bulunduğu yol HEAD'e daha yakın bir noktada başlar.
Bence bu ikinci cevabı genellikle geliştirme tarihinde daha yakından istiyorsunuz. Bunu git log v0.2..HEAD
her bir etiket için etc kullanarak bulabilirsiniz . Bu, HEAD v0.2
tarafından izlenen yoldan sapan yoldan sonra HEAD üzerindeki taahhütlerin sayısını verir .
İşte bu kontrolü çalıştıran tüm etiketleri yineleyerek ve etiket yolu saptığından beri etiketi HEAD üzerinde en az işlem yaparak yazdıran bir Python betiği:
https://github.com/MacPython/terryfy/blob/master/git-closest-tag
git describe
HEAD'den geçmişte bir yoldaki ilk etiketi bulmak için HEAD'den (örneğin) geri izlediği için biraz farklı bir şey yapar. Git terimleriyle, HEAD'den git describe
"ulaşılabilir" etiketleri arar. Bu nedenle v0.2
, HEAD'den geri yolda değil, oradan ayrılan bir yol gibi etiketler bulacaktır .
git describe --tags
geçerli dal tarafından görülebilen son etiketi döndürür
git log --tags --no-walk --pretty="format:%d" | sed 2q | sed 's/[()]//g' | sed s/,[^,]*$// | sed 's ...... '
SON BİR ETİKETTEN DAHA FAZLA İHTİYACINIZ VARSA
(git tarif --tags bazen yanlış hashes verir, neden bilmiyorum, ama benim için - max-count 2 çalışmıyor)
ters kronolojik sırayla en son 2 etiket isimleri ile liste bu şekilde alabilirsiniz, git 1.8.4 üzerinde mükemmel çalışır. Git'in önceki sürümleri için (1.7. * Gibi), çıktıda "tag:" dizesi yoktur - yalnızca son sed çağrısını silin
2'den fazla son etiket istiyorsanız - bu "sed 2q" yi "sed 5q" olarak veya neye ihtiyacınız varsa değiştirin
Daha sonra her etiket adını değişkene kolayca ayrıştırabilirsiniz.
git log --tags --no-walk --pretty="format:%D" | sed -nr '5q;s;^.*(tag: )([^,]*).*;\2;p'
burada %D
çevredeki ()
karakterleri hariç tutar ve sed
başlangıç 5q değeri 5'ten önce 4 satır bırakır, sonra 'tag: `ve ilk', arasındaki tüm karakterleri yazdırır. Yani ... etiketin içinde virgül kullanılmadığı varsayılarak, bu mükemmel çalışıyor.
Tüm önerilerinde yanlış olan ne ( Matthew Brett'in açıklaması dışında , bu cevap postasının bugüne kadar)?
Sadece jQuery Git geçmişine diğer tarafından sağlanan herhangi bir komutu çalıştırmak sizi de geçmiş farklı bakış ile ve onay sonucu görsel etiketleme geçmişi temsil (ı did Eğer bu mesajı görüyorsanız yüzden):
$ git log --graph --all --decorate --oneline --simplify-by-decoration
Günümüzde birçok proje , ana şubeden ayrı dallarda sürümleri (ve böylece etiketlemeyi) gerçekleştirmektedir .
Bunun güçlü bir nedeni var . Sadece iyi kurulmuş JS / CSS projelerine bakın. Kullanıcı kuralları için DVCS'de ikili / simge durumuna getirilmiş sürüm dosyaları taşırlar. Doğal olarak proje koruyucusu olarak, ana hattınızın farklı geçmişini işe yaramaz ikili bloblarla çöpe atmak ve ana hattan yapı yapılarının taahhüdünü gerçekleştirmek istemezsiniz .
Git doğrusal geçmişi değil DAG kullandığından - mesafe metriğini tanımlamak zordur, bu yüzden şunu söyleyebiliriz - oh bu devir benim en yakınım HEAD
!
Kendi yolculuğuma başladım (içine bakın, bu uzun yazıya süslü resimler kopyalamadım):
Git'te dallanma konusunda geçmişte en yakın etiket hangisidir?
Şu anda yararlılığı azaltarak etiket ve revizyon arasındaki mesafenin 4 makul tanımı var:
HEAD
için birleştirme baz etiketiyleHEAD
ve etiketEn kısa yolun uzunluğunu nasıl hesaplayacağımı bilmiyorum .
Etiketleri , ve tag arasındaki birleştirme tabanı tarihine göre sıralayan komut dosyası :HEAD
$ git tag \
| while read t; do \
b=`git merge-base HEAD $t`; \
echo `git log -n 1 $b --format=%ai` $t; \
done | sort
Çoğu projede kullanılabilir.
Etiketleri HEAD'den erişilebilen ancak etiketten erişilemeyen devir sayısına göre sıralayan komut dosyası :
$ git tag \
| while read t; do echo `git rev-list --count $t..HEAD` $t; done \
| sort -n
Proje geçmişinizin taahhütlerde garip tarihleri varsa (yeniden basmalar veya başka bir tarih yeniden yazımı veya bazı moronlar nedeniyle BIOS pilini veya tarihte yaptığınız diğer büyüleri değiştirmeyi unutmayın) yukarıdaki komut dosyasını kullanın.
Son seçenek için ( birleştirme tabanına bakılmaksızın etiketin tarihi ) tarihe göre sıralanmış etiketlerin listesini almak için:
$ git log --tags --simplify-by-decoration --pretty="format:%ci %d" | sort -r
Geçerli düzeltme tarihini öğrenmek için şunu kullanın:
$ git log --max-count=1
git describe --tags
Kendi durumlarında kullanımı olan ancak proje tarihinde insanın beklediği en yakın etiketi bulmak için kullanılmadığını unutmayın .
NOT Herhangi bir revizyonda yukarıdaki tarifleri kullanabilirsiniz, sadece HEAD
istediğiniz ile değiştirin !
git tag -l ac* | tail -n1
Son etiketi "ac" önekiyle al . Örneğin ac1.0.0
, veya ile adlandırılmış etiket ac1.0.5
. Adlı Diğer etiketler 1.0.0
, 1.1.0
göz ardı edilecektir.
git tag -l [0-9].* | tail -n1
İlk karakteri olan son etiketi alın 0-9
. Bu nedenle, ilk karakterli etiketler a-z
dikkate alınmaz.
git tag --help # Help for `git tag`
git tag -l <pattern>
Verilen kalıpla eşleşen adlara sahip etiketleri (veya kalıp verilmemişse tümünü) listeleyin. "Git tag" ifadesini bağımsız değişkenler olmadan çalıştırmak tüm etiketleri listeler. Desen bir kabuk joker karakteridir (yani fnmatch (3) kullanılarak eşleştirilir). Birden çok desen verilebilir; bunlardan herhangi biri eşleşirse, etiket gösterilir.
tail -n <number> # display the last part of a file
tail -n1 # Display the last item
İle git tag --help
, sort
tartışma hakkında. Özellik yoksa lexicorgraphic order
varsayılan olarak kullanılır tag.sort
.
Sıralama düzeni varsayılanları, varsa tag.sort değişkeni için yapılandırılmış değere, aksi halde sözlükbilimsel düzene göre sıralanır. Bkz. Git-config (1).
Google'dan sonra, birisi sözdizimini takiben git 2.8.0 desteği dedi .
git tag --sort=committerdate
git tag --sort=committerdate | tail -1
Son iki etikete ihtiyacınız olduğunda (örneğin, geçerli etiket ile önceki etiket arasında değişiklik günlüğü oluşturmak için) aşağıdakiler benim için çalışır. Sadece son etiketin olduğu durumda test ettim 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_"`
Benim ihtiyaçlarıma uygun, ama git sihirbazı olmadığım için daha da geliştirilebileceğinden eminim. Ayrıca, taahhüt tarihinin ilerlemesi durumunda kırılacağından şüpheleniyorum. Sadece birine yardım etmesi durumunda paylaşıyorum.
İlk düşüncem, git rev-list HEAD
tüm devirleri ters kronolojik sırayla listeleyen, kullanabileceğiniz git tag --contains
. git tag --contains
Boş olmayan bir liste oluşturan bir ref bulduğunuzda, en son etiketleri buldunuz.
Geçerli dalda en son etiket adını (etiket tarihine göre) alan bir astara ihtiyacınız varsa :
git for-each-ref refs/tags --sort=-taggerdate --format=%(refname:short) --count=1 --points-at=HEAD
Kurulumda sürüm numarasını ayarlamak için bunu kullanırız.
Çıktı örneği:
v1.0.0
Windows üzerinde de çalışır.
-bash: syntax error near unexpected token '('
--format="%(refname:short)"
) ve atlayarak --points-at=HEAD
çalışır. Bu son anahtarla hiçbir şey döndürmez, sanırım benim HEAD
etiketli değil mi?
HEAD
etiketlenmemiş olması.
Bu eski bir iş parçacığıdır, ancak birçok insan OP'nin sorusuna en basit, en kolay ve en doğru cevabı kaçırıyor gibi görünüyor: mevcut dal için en son etiketi almak için kullanıyorsunuz git describe HEAD
. Bitti.
Düzenleme: Ayrıca herhangi bir geçerli refname, hatta uzaktan kumanda sağlayabilirsiniz; yani, git describe origin/master
orijin / master'dan ulaşılabilecek en son etiketi söyleyecektir.
for-each-ref
( stackoverflow.com/a/5261470/515973 ) komutu ve rev-list
ve describe
( stackoverflow.com/a/7979255/515973 )
git describe branchname --tags
benim için en son etiketi almak için çalışıyor (git sürüm 2.12.2)
En son etiketi yalnızca geçerli dalda önek bulunan geçerli dalda / etiket adında almak için aşağıdakileri yürütmek zorunda kaldım
BRANCH=`git rev-parse --abbrev-ref HEAD` && git describe --tags --abbrev=0 $BRANCH^ | grep $BRANCH
Şube yöneticisi:
git checkout master
BRANCH=`git rev-parse --abbrev-ref HEAD` && git describe --tags
--abbrev=0 $BRANCH^ | grep $BRANCH
master-1448
Şube özel:
git checkout 9.4
BRANCH=`git rev-parse --abbrev-ref HEAD` && git describe --tags
--abbrev=0 $BRANCH^ | grep $BRANCH
9.4-6
Ve son ihtiyacım olan sonraki etiketleme için +1 etiketini artırmam ve almam gerekiyor.
BRANCH=`git rev-parse --abbrev-ref HEAD` && git describe --tags --abbrev=0 $BRANCH^ | grep $BRANCH | awk -F- '{print $NF}'
Sorulduğu gibi,
Geçerli dalda en son etiket adı nasıl alınır?
İstediğiniz
git log --first-parent --pretty=%d | grep -m1 tag:
--first-parent
git log
herhangi bir birleştirilmiş tarihin detaylandırılmamasını söyler , --pretty=%d
sadece süslemeler, yani herhangi bir taahhüt için yerel isimler göstermeyi söyler. grep -m1
"yalnızca bir tanesiyle eşleştir" der, böylece en son etiketi alırsınız.
Açıklamalı etiketlere ve açıklamalı etiketlere burada çok fazla değinilmiyor. 'tanımla' açıklamalı etiketler üzerinde çalışır ve açıklanmamış etiketleri yok sayar.
Bu çirkin ama istenen iş yok ve diğer dallarda hiçbir etiket bulamayacak (komutta belirtilen etikette değil: aşağıdaki örnekte master)
Filtreleme optimize edilmelidir (konsolide), ama yine, bu iş gibi görünüyor.
git log --decorate --tags master |grep '^commit'|grep 'tag:.*)$'|awk '{print $NF}'|sed 's/)$//'|head -n 1
Şimdi kullanmak için koyacağım gibi kriterler hoş geldiniz :)