วิธีที่ง่ายที่สุดในการรับแท็กล่าสุดใน Git คืออะไร
git tag a HEAD
git tag b HEAD^^
git tag c HEAD^
git tag
เอาท์พุท:
a
b
c
ฉันควรเขียนสคริปต์เพื่อให้ได้รับวันที่และเวลาของแท็กและเปรียบเทียบได้อย่างไร
วิธีที่ง่ายที่สุดในการรับแท็กล่าสุดใน Git คืออะไร
git tag a HEAD
git tag b HEAD^^
git tag c HEAD^
git tag
เอาท์พุท:
a
b
c
ฉันควรเขียนสคริปต์เพื่อให้ได้รับวันที่และเวลาของแท็กและเปรียบเทียบได้อย่างไร
คำตอบ:
คุณสามารถดูgit describe
ซึ่งทำอะไรบางอย่างใกล้เคียงกับสิ่งที่คุณถาม
--abbrev=0
มันควรจะกลับแท็กคำอธิบายประกอบที่ใกล้เคียงที่สุด
git describe --exact-match --abbrev=0
ใช้
git describe --tags
และเปรียบเทียบแท็ก com ล่าสุดในหน้าปล่อย Github
วิธีรับแท็กล่าสุด:
git describe --tags
วิธีรับแท็กที่มีคำอธิบายประกอบล่าสุด:
git describe --abbrev=0
git describe
พูดว่า: --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)
จะส่งออกแท็กของการติดแท็กล่าสุดที่กระทำในทุกสาขา
git describe --tags $(git rev-list --tags --max-count=1)
TAG=$(git describe --tags $(git rev-list --tags --max-count=1))
@ william-pursell
หากต้องการรับแท็กล่าสุดคุณสามารถทำได้:
$ git สำหรับแต่ละการอ้างอิง / แท็ก --sort = -taggerdate --format = '% (refname)' --count = 1
แน่นอนคุณสามารถเปลี่ยนอาร์กิวเมนต์จำนวนหรือเขตข้อมูลเรียงตามที่ต้องการ ดูเหมือนว่าคุณอาจต้องการถามคำถามที่แตกต่างกันเล็กน้อย แต่สิ่งนี้จะตอบคำถามเมื่อฉันตีความมัน
--sort=-authordate
--sort=authordate
--sort=-taggerdate
เพราะสิ่งที่คุณต้องการจริง สำหรับแท็กauthordate
และcommitterdate
ว่างเปล่า (ไม่มีประโยชน์เหมือนกับปุ่มจัดเรียง)
git for-each-ref refs/tags --sort=-taggerdate --format='%(refname:short)' --count=1
ดียิ่งขึ้น :)
--points-at=$SHA
จะให้แท็กแฮชคอมมิท
แล้วเรื่องนี้ล่ะ
TAG=$(git describe $(git rev-list --tags --max-count=1))
ในทางเทคนิคคุณไม่จำเป็นต้องได้รับแท็กล่าสุด แต่การกระทำล่าสุดที่ติดแท็กซึ่งอาจเป็นหรืออาจไม่ใช่สิ่งที่คุณกำลังมองหา
--tags=<pattern>
rev-list
ตัวอย่างเช่นรับแท็กเวอร์ชันล่าสุดgit describe --tags $(git rev-list --tags='v[0-9].[0-9]*' --max-count=1)
git describe --tags $(git rev-list --tags --max-count=1)
คุณสามารถดำเนินการ: git describe --tags $(git rev-list --tags --max-count=1)
พูดคุยที่นี่: วิธีรับชื่อแท็กล่าสุด?
git describe ...
ส่งกลับแท็กก่อนหน้านี้หรือไม่!)
--abbrev=0
คำตอบบางคำแล้วพวกเขาก็ตัดบางส่วนของแท็กที่ฉันต้องการ
"ล่าสุด" อาจมีความหมายสองประการในแง่ของคอมไพล์
คุณอาจหมายถึง "แท็กใดที่มีวันที่สร้างล่าสุดทันเวลา" และคำตอบส่วนใหญ่ที่นี่สำหรับคำถามนั้น c
ในแง่ของคำถามของคุณคุณจะต้องการที่จะกลับมาแท็ก
หรือคุณอาจจะหมายถึง "ซึ่งเป็นแท็กใกล้เคียงที่สุดในประวัติศาสตร์การพัฒนาบางสาขาที่มีชื่อว่า" HEAD
มักสาขาที่คุณอยู่บน a
ในคำถามของคุณนี้จะกลับมาแท็ก
สิ่งเหล่านี้อาจแตกต่างกันแน่นอน:
A->B->C->D->E->F (HEAD)
\ \
\ X->Y->Z (v0.2)
P->Q (v0.1)
ลองนึกภาพแท็กของนักพัฒนาซอฟต์แวร์ที่Z
เป็นv0.2
ในวันจันทร์จากนั้นติดแท็กที่Q
เป็นv0.1
วันอังคาร v0.1
เป็นสิ่งที่เพิ่งเกิดขึ้น แต่v0.2
ใกล้เข้ามาในประวัติศาสตร์การพัฒนาของ HEAD ในแง่ที่ว่าเส้นทางนั้นเริ่มต้นที่จุดที่ใกล้กับ HEAD มากขึ้น
ฉันคิดว่าคุณมักต้องการคำตอบที่สองนี้อย่างใกล้ชิดในประวัติศาสตร์การพัฒนา คุณสามารถค้นหาโดยใช้git log v0.2..HEAD
etc สำหรับแต่ละแท็ก สิ่งนี้ทำให้คุณมีจำนวนการผูกมัดบน HEAD ตั้งแต่เส้นทางที่สิ้นสุดที่v0.2
แยกจากเส้นทางตามด้วย HEAD
ต่อไปนี้เป็นสคริปต์ Python ที่ทำโดยการวนซ้ำแท็กทั้งหมดที่เรียกใช้การตรวจสอบนี้จากนั้นพิมพ์แท็กที่มีค่าคอมมิชชันที่น้อยที่สุดบน HEAD ตั้งแต่เส้นทางแท็กถูกแยกออก:
https://github.com/MacPython/terryfy/blob/master/git-closest-tag
git describe
ทำบางสิ่งที่แตกต่างเล็กน้อยซึ่งจะติดตามกลับจาก (เช่น) HEAD เพื่อค้นหาแท็กแรกที่อยู่บนเส้นทางย้อนกลับในประวัติศาสตร์จาก HEAD ในแง่คอมไพล์git describe
ค้นหาแท็กที่ "เข้าถึงได้" จาก HEAD ดังนั้นจะไม่พบแท็กแบบv0.2
ที่ไม่ได้อยู่บนเส้นทางที่กลับมาจาก HEAD แต่เป็นเส้นทางที่แยกจากที่นั่น
git describe --tags
ส่งกลับแท็กล่าสุดที่สามารถเห็นได้โดยสาขาปัจจุบัน
git log --tags --no-walk --pretty="format:%d" | sed 2q | sed 's/[()]//g' | sed s/,[^,]*$// | sed 's ...... '
หากคุณต้องการแท็กสุดท้ายมากกว่าหนึ่ง
(git อธิบาย - บางครั้งแท็กให้แฮ็กผิดฉันไม่รู้ว่าทำไม แต่สำหรับฉัน - max-count 2 ไม่ทำงาน)
นี่คือวิธีที่คุณจะได้รับรายชื่อด้วย 2 ชื่อแท็กล่าสุดตามลำดับเวลาย้อนหลังทำงานได้อย่างสมบูรณ์บน git 1.8.4 สำหรับ git รุ่นก่อนหน้า (เช่น 1.7. *) ไม่มี "tag:" สายอักขระในเอาต์พุต - เพียงแค่ลบสายเรียกล่าสุด
หากคุณต้องการมากกว่า 2 แท็กล่าสุด - เปลี่ยน "sed 2q" เป็น "sed 5q" หรืออะไรก็ได้ที่คุณต้องการ
จากนั้นคุณสามารถแยกวิเคราะห์ชื่อแท็กทุกชื่อได้อย่างง่ายดาย
git log --tags --no-walk --pretty="format:%D" | sed -nr '5q;s;^.*(tag: )([^,]*).*;\2;p'
โดย%D
ไม่รวม()
ตัวอักษรที่อยู่รอบ ๆ และตัวอักษรsed
เริ่มต้น 5q จะทิ้ง 4 บรรทัดก่อนหน้า 5 จากนั้นพิมพ์อักขระทั้งหมดระหว่าง 'แท็ก: `และตัวแรก', ' ดังนั้น ... สมมติว่าไม่มีการใช้เครื่องหมายจุลภาคในแท็ก
เกิดอะไรขึ้น กับคำแนะนำทั้งหมด (ยกเว้นคำอธิบายของMatthew Brett , จนถึงปัจจุบันของคำตอบนี้)?
เพียงแค่เรียกใช้คำสั่งใด ๆ ที่จัดทำโดยประวัติ jQuery Git เมื่อคุณอยู่ที่จุดที่แตกต่างกันของประวัติศาสตร์และตรวจสอบผลด้วยการแสดงประวัติการติดแท็กภาพ (ฉันทำนั่นคือเหตุผลที่คุณเห็นโพสต์นี้):
$ git log --graph --all --decorate --oneline --simplify-by-decoration
วันนี้หลายโครงการดำเนินการเผยแพร่ (และการติดแท็ก) ในสาขาที่แยกต่างหากจากการฉีดยา
มีเหตุผลที่แข็งแกร่งสำหรับเรื่องนี้ เพียงแค่มองไปที่โครงการ JS / CSS ที่เป็นที่ยอมรับ สำหรับข้อตกลงผู้ใช้พวกเขามีไฟล์รีลีสไบนารี / minified ใน DVCS ธรรมชาติเป็นผู้ดูแลโครงการที่คุณไม่ต้องการที่จะพ้นจากขยะของคุณdiffประวัติศาสตร์ที่มี blobs ไบนารีที่ไร้ประโยชน์และดำเนินการกระทำของการสร้างสิ่งประดิษฐ์จากฉีด
เนื่องจาก Git ใช้ DAG และไม่ใช่เชิงเส้นประวัติ - มันยากที่จะกำหนดตัวชี้วัดระยะทาง ดังนั้นเราจึงสามารถพูดได้ - โอ้ rev นั้นใกล้กับฉันมากที่สุดHEAD
!
ฉันเริ่มการเดินทางของตัวเองใน (ดูข้างในฉันไม่ได้คัดลอกภาพที่สวยงามไปยังโพสต์ยาวนี้):
แท็กที่ใกล้ที่สุดในอดีตที่เกี่ยวกับการแตกแขนงใน Git คืออะไร
ขณะนี้ฉันมีคำจำกัดความที่สมเหตุสมผลเกี่ยวกับระยะห่างระหว่างแท็กและการแก้ไขด้วยการลดประโยชน์:
HEAD
ถึงรวมฐานด้วยแท็กHEAD
และแท็กผมไม่ทราบวิธีการคำนวณความยาวของเส้นทางที่สั้นที่สุด
สคริปต์ที่แท็กเรียงลำดับตาม วันที่ของฐานการผสานระหว่างHEAD
และแท็ก:
$ git tag \
| while read t; do \
b=`git merge-base HEAD $t`; \
echo `git log -n 1 $b --format=%ai` $t; \
done | sort
สามารถใช้งานได้กับโครงการส่วนใหญ่
สคริปต์ที่เรียงลำดับแท็กตามจำนวนรอบที่สามารถเข้าถึงได้จาก HEAD แต่ไม่สามารถเข้าถึงได้จากแท็ก:
$ git tag \
| while read t; do echo `git rev-list --count $t..HEAD` $t; done \
| sort -n
หากประวัติโครงการของคุณมีวันที่ที่ผิดปกติ (เนื่องจากการ rebases หรือการเขียนประวัติอื่นหรือปัญญาอ่อนบางคนลืมที่จะเปลี่ยนแบตเตอรี่ BIOS หรือเวทมนตร์อื่น ๆ ที่คุณทำในประวัติศาสตร์) ใช้สคริปต์ข้างต้น
สำหรับตัวเลือกสุดท้าย ( วันที่ของแท็กโดยไม่คำนึงถึงฐานผสาน ) เพื่อรับรายการของแท็กเรียงตามวันที่ใช้:
$ git log --tags --simplify-by-decoration --pretty="format:%ci %d" | sort -r
หากต้องการทราบวันที่แก้ไขปัจจุบันให้ใช้:
$ git log --max-count=1
ทราบว่าgit describe --tags
มีการใช้งานในกรณีที่เป็นของตัวเอง แต่ไม่ได้สำหรับการหามนุษย์คาดว่าแท็กที่ใกล้ที่สุดในประวัติศาสตร์ของโครงการ
หมายเหตุคุณสามารถใช้สูตรด้านบนในการแก้ไขใด ๆ เพียงแทนที่HEAD
ด้วยสิ่งที่คุณต้องการ!
git describe --abbrev=0 --tags
หากคุณไม่เห็นแท็กล่าสุดตรวจสอบให้แน่ใจว่าได้ดึงแหล่งกำเนิดก่อนที่จะเรียกใช้:
git remote update
git tag -l ac* | tail -n1
รับแท็กที่ผ่านมาด้วยคำนำหน้า"AC" ยกตัวอย่างเช่นแท็กชื่อด้วยหรือac1.0.0
ac1.0.5
แท็กอื่น ๆ ชื่อ1.0.0
, 1.1.0
จะถูกละเว้น
git tag -l [0-9].* | tail -n1
0-9
รับแท็กที่ผ่านมาที่มีถ่านแรกคือ ดังนั้นแท็กที่มีอักขระตัวแรกa-z
จะถูกละเว้น
git tag --help # Help for `git tag`
git tag -l <pattern>
รายการแท็กที่มีชื่อที่ตรงกับรูปแบบที่กำหนด (หรือทั้งหมดหากไม่มีรูปแบบกำหนดไว้) การเรียกใช้ "แท็ก git" โดยไม่มีอาร์กิวเมนต์จะแสดงรายการแท็กทั้งหมดด้วย รูปแบบเป็นสัญลักษณ์แทนเชลล์ (เช่นจับคู่โดยใช้ fnmatch (3)) อาจมีหลายรูปแบบ หากมีรายการใดตรงกับแท็กนั้นจะปรากฏขึ้น
tail -n <number> # display the last part of a file
tail -n1 # Display the last item
ด้วยgit tag --help
เกี่ยวกับการsort
โต้แย้ง มันจะใช้lexicorgraphic order
ตามค่าเริ่มต้นหากtag.sort
ไม่มีคุณสมบัติ
เรียงลำดับค่าเริ่มต้นเป็นค่าที่ตั้งค่าไว้สำหรับตัวแปร tag.sort หากมีอยู่หรือมีคำสั่งทำพจนานุกรมอื่น ดู git-config (1)
หลังจาก google มีคนพูดว่า git 2.8.0 รองรับการติดตามไวยากรณ์
git tag --sort=committerdate
git tag --sort=committerdate | tail -1
ต่อไปนี้ใช้ได้กับฉันในกรณีที่คุณต้องการสองแท็กสุดท้าย (ตัวอย่างเช่นเพื่อสร้างบันทึกการเปลี่ยนแปลงระหว่างแท็กปัจจุบันและแท็กก่อนหน้า) ฉันได้ทดสอบในกรณีที่แท็กล่าสุดเป็น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_"`
มันเหมาะกับความต้องการของฉัน แต่เนื่องจากฉันไม่มีตัวช่วยสร้างคอมไพล์ฉันแน่ใจว่ามันจะดีขึ้นอีก ฉันยังสงสัยว่ามันจะพังในกรณีที่ประวัติการกระทำก้าวไปข้างหน้า ฉันแค่แบ่งปันในกรณีที่ช่วยใครบางคน
ความคิดแรกของฉันคือคุณสามารถใช้git rev-list HEAD
ซึ่งจะแสดงรายการ revs git tag --contains
ทั้งหมดที่อยู่ในลำดับย้อนกลับในการรวมกันกับ เมื่อคุณพบการอ้างอิงที่git tag --contains
สร้างรายการที่ไม่ว่างคุณจะพบแท็กล่าสุด
หากคุณต้องการค้นหาแท็กสุดท้ายที่นำไปใช้กับสาขาเฉพาะคุณสามารถลองต่อไปนี้:
git describe --tag $(git rev-parse --verify refs/remotes/origin/"branch_name")
หากคุณต้องการสายการบินหนึ่งที่ได้รับชื่อแท็กล่าสุด (ตามวันที่แท็ก) ในสาขาปัจจุบัน :
git for-each-ref refs/tags --sort=-taggerdate --format=%(refname:short) --count=1 --points-at=HEAD
เราใช้สิ่งนี้เพื่อตั้งค่าหมายเลขรุ่นในการตั้งค่า
ตัวอย่างผลลัพธ์:
v1.0.0
ทำงานบน Windows ได้เช่นกัน
-bash: syntax error near unexpected token '('
--format="%(refname:short)"
) และข้ามส่วน--points-at=HEAD
นั้นไปใช้งานได้ ด้วยสวิตช์ครั้งสุดท้ายมันไม่ได้อะไรเลยฉันเดาว่าเพราะฉันHEAD
ไม่มีแท็ก
HEAD
ไม่ได้แท็ก
นี่เป็นเธรดเก่า แต่ดูเหมือนว่าผู้คนจำนวนมากขาดคำตอบที่ง่ายที่สุดง่ายที่สุดและถูกต้องที่สุดสำหรับคำถามของ OP: เพื่อให้ได้แท็กล่าสุดสำหรับสาขาปัจจุบันคุณใช้git describe HEAD
คุณใช้เสร็จสิ้น
แก้ไข: คุณยังสามารถระบุชื่อที่ถูกต้องใด ๆ แม้แต่รีโมต เช่นgit describe origin/master
จะบอกแท็กล่าสุดที่สามารถเข้าถึงได้จากจุดเริ่มต้น / ต้นแบบ
for-each-ref
คำสั่ง ( stackoverflow.com/a/5261470/515973 ) และการรวมกันของrev-list
และdescribe
( stackoverflow.com/a/7979255/515973 )
git describe branchname --tags
ทำงานให้ฉันเพื่อรับแท็กล่าสุดในสาขา (รุ่น git 2.12.2)
เพื่อให้ได้แท็กล่าสุดเฉพาะในสาขา / ชื่อแท็กปัจจุบันที่นำหน้าด้วยสาขาปัจจุบันฉันต้องดำเนินการดังต่อไปนี้
BRANCH=`git rev-parse --abbrev-ref HEAD` && git describe --tags --abbrev=0 $BRANCH^ | grep $BRANCH
หัวหน้าสาขา:
git checkout master
BRANCH=`git rev-parse --abbrev-ref HEAD` && git describe --tags
--abbrev=0 $BRANCH^ | grep $BRANCH
master-1448
กำหนดเองสาขา:
git checkout 9.4
BRANCH=`git rev-parse --abbrev-ref HEAD` && git describe --tags
--abbrev=0 $BRANCH^ | grep $BRANCH
9.4-6
และสุดท้ายของฉันต้องเพิ่มและรับแท็ก +1 สำหรับการติดแท็กถัดไป
BRANCH=`git rev-parse --abbrev-ref HEAD` && git describe --tags --abbrev=0 $BRANCH^ | grep $BRANCH | awk -F- '{print $NF}'
สำหรับคำถามที่ถาม
วิธีรับชื่อแท็กล่าสุดในสาขาปัจจุบัน
คุณต้องการ
git log --first-parent --pretty=%d | grep -m1 tag:
--first-parent
บอกว่าจะgit log
ไม่ให้รายละเอียดใด ๆ รวมประวัติศาสตร์--pretty=%d
บอกว่าจะแสดงเฉพาะการตกแต่งเช่นชื่อท้องถิ่นสำหรับการกระทำใด ๆ grep -m1
พูดว่า "จับคู่แค่แท็กเดียว" ดังนั้นคุณจะได้รับแท็กล่าสุด
หากแท็กของคุณสามารถจัดเรียงได้:
git tag --merged $YOUR_BRANCH_NAME | grep "prefix/" | sort | tail -n 1
ไม่ค่อยมีการพูดถึงแท็กที่ไม่ได้จดทะเบียนกับแท็กที่มีคำอธิบายประกอบที่นี่ 'อธิบาย' ทำงานบนแท็กที่มีคำอธิบายประกอบและละเว้นแท็กที่ไม่ได้ใส่คำอธิบาย
สิ่งนี้น่าเกลียด แต่งานร้องขอและมันจะไม่พบแท็กใด ๆ ในสาขาอื่น ๆ (และไม่ได้อยู่ในแท็กที่ระบุในคำสั่ง: master ในตัวอย่างด้านล่าง)
การกรองควรได้รับการปรับให้เหมาะสม (รวมแล้ว) แต่ดูเหมือนว่าจะเป็นงานอีกครั้ง
git log --decorate --tags master |grep '^commit'|grep 'tag:.*)$'|awk '{print $NF}'|sed 's/)$//'|head -n 1
คำติชมยินดีต้อนรับขณะที่ฉันกำลังจะนำสิ่งนี้ไปใช้ :)