كيفية الحصول على أحدث اسم العلامة في الفرع الحالي في Git؟

StackOverflow https://stackoverflow.com/questions/1404796

سؤال

ما هي أبسط طريقة للحصول على أحدث علامة في Git؟

git tag a HEAD
git tag b HEAD^^
git tag c HEAD^
git tag

انتاج:

a
b
c

هل يجب أن أكتب برنامجًا نصيًا للحصول على تاريخ كل علامة ومقارنتها؟

هل كانت مفيدة؟

المحلول

هل يمكن أن نلقي نظرة على git describe، والتي لا شيء قريب من ما كنت طالبا.

نصائح أخرى

لتحصل على العلامة أحدث:

git describe --tags

للحصول على أحدث المشروح العلامة:

git describe --abbrev=0

وسيتم إخراج علامة من أحدث معلم تلتزم في جميع فروع

git describe --tags $(git rev-list --tags --max-count=1)

لتحصل على العلامة أحدث، يمكنك القيام به:

$ git for-each-ref refs/tags --sort=-taggerdate --format='%(refname)' --count=1

وبطبيعة الحال، يمكنك تغيير حجة العد أو الحقل نوع كما تريد. يظهر التي كنت قد يعني أن أطرح سؤالا مختلفا بعض الشيء، ولكن هذا لا يجيب على سؤال حول ما أفسر ذلك.

وماذا عن هذا؟

وTAG=$(git describe $(git rev-list --tags --max-count=1))

ومن الناحية الفنية، وليس بالضرورة تحصل على أحدث علامة، ولكن أحدث ارتكاب التي هي المعلمة، والتي قد تكون أو لا تكون الشيء الذي تبحث عنه.

وgit describe --tags

وإرجاع العلامة الأخيرة قادرة على أن ينظر إليها من قبل فرع الحالي

و"الأحدث" يمكن أن يكون معنيان من حيث بوابة.

هل يمكن أن يعني "، والذي علامة من تاريخ إنشاء أحدث في الوقت المناسب"، ومعظم الإجابات هنا على هذا السؤال. من حيث سؤالك، هل يريدون العودة العلامة c.

وأو هل يمكن أن يعني "العلامة التي هو الأقرب في تاريخ التنمية لبعض فرع اسمه"، عادة الفرع كنت على، HEAD. في سؤالك، فإن هذا يعود العلامة a.

وهذه قد تكون مختلفة بالطبع:

A->B->C->D->E->F (HEAD)
       \     \
        \     X->Y->Z (v0.2)
         P->Q (v0.1)

وتخيل المطور tag'ed Z كما v0.2 يوم الاثنين، ثم tag'ed Q كما v0.1 يوم الثلاثاء. v0.1 هو أكثر حداثة، ولكن v0.2 هو أقرب في تاريخ التنمية في الرأس، بمعنى أن الطريق كان على يبدأ عند نقطة أقرب إلى الرأس.

وأعتقد أنك عادة ما ترغب هذه الإجابة الثانية، أوثق في تاريخ التنمية. يمكنك معرفة ذلك باستخدام git log v0.2..HEAD الخ لكل علامة. وهذا يمنحك عدد من يرتكب في الرأس منذ مسار تنتهي في v0.2 تباينت من مسار تليها الرأس.

وفيما يلي نص برمجي بلغة Python يفعل ذلك من قبل بالتكرار عبر جميع العلامات تشغيل هذا الاختيار، ثم طبع العلامة مع أقل عدد من يرتكب في الرأس منذ تباينت طريق العلامة:

https://github.com/MacPython/terryfy/blob/master/git-closest -tag

وgit describe يفعل شيئا مختلفا قليلا، حيث أنه يقيس مرة أخرى من (على سبيل المثال) رأس للعثور على الفئة الأولى التي هي في طريق العودة في التاريخ من الرأس. من ناحية بوابة، git describe يبحث عن العلامات التي هي "قابلة للوصول" من الرأس. وبالتالي فإنه لن تجد العلامات مثل v0.2 التي ليست على الطريق الخلفي من الرأس، ولكن المسار الذي تباينت من هناك.

ويمكنك تنفيذ: تحدث git describe --tags $(git rev-list --tags --max-count=1) هنا: كيفية الحصول على أحدث اسم العلامة؟

git log --tags --no-walk --pretty="format:%d" | sed 2q | sed 's/[()]//g' | sed s/,[^,]*$// | sed  's ......  '

إذا كنت بحاجة إلى أكثر من علامة أخيرة

(وصف git --tags يعطي أحيانًا تجزئات خاطئة، لا أعرف السبب، ولكن بالنسبة لي --max-count 2 لا يعمل)

هذه هي الطريقة التي يمكنك من خلالها الحصول على قائمة بأحدث أسماء العلامات بترتيب زمني عكسي، وتعمل بشكل مثالي على git 1.8.4.بالنسبة للإصدارات السابقة من git (مثل 1.7.*)، لا توجد علامة ":"سلسلة في الإخراج - فقط احذف آخر مكالمة sed

إذا كنت تريد أكثر من علامتين حديثتين - قم بتغيير "sed 2q" إلى "sed 5q" أو أي شيء تحتاجه

ثم يمكنك بسهولة تحليل كل اسم علامة إلى متغير أو نحو ذلك.

ما هو خطأ مع كافة الاقتراحات (باستثناء ماثيو بريت شرح، حتى تاريخ هذا الرد آخر)؟

ما عليك سوى تشغيل أي أمر يقدمه الآخرون في سجل jQuery Git عندما تكون في نقطة مختلفة من التاريخ والتحقق من النتيجة مع تمثيل تاريخ العلامات المرئية (أنا فعل ولهذا السبب ترى هذا المنشور):

$ git log --graph --all --decorate --oneline --simplify-by-decoration

في الوقت الحاضر، يقوم العديد من المشاريع بتنفيذ الإصدارات (وبالتالي وضع العلامات) في فرع منفصل عن الخط الرئيسي.

هناك سبب قوي لهذا.ما عليك سوى إلقاء نظرة على أي مشاريع JS/CSS راسخة.بالنسبة لاتفاقيات المستخدم، فإنها تحمل ملفات إصدار ثنائية/مصغرة في DVCS.بطبيعة الحال، باعتبارك مشرفًا على المشروع، فإنك لا ترغب في إتلاف خطك الرئيسي فرق التاريخ مع النقط الثنائية عديمة الفائدة وتنفيذ الالتزام بعناصر البناء خارج الخط الرئيسي.

لأن Git يستخدم DAG وليس التاريخ الخطي - فهو كذلك من الصعب تحديد قياس المسافة لذلك يمكننا أن نقول - أوه، إن المراجعة هي الأقرب إلى ما لدي HEAD!

أبدأ رحلتي الخاصة في (انظر إلى الداخل، لم أنسخ صور إثبات رائعة لهذا المنشور الطويل):

ما هي أقرب علامة في الماضي فيما يتعلق بالتفرع في Git؟

لدي حاليًا 4 تعريفات معقولة للمسافة بين العلامة والمراجعة مع تقليل الفائدة:

  • طول أقصر طريق من HEAD ل قاعدة الدمج مع العلامة
  • تاريخ ل قاعدة الدمج بين 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

إذا كان سجل مشروعك يحتوي على تواريخ غريبة عند الالتزامات (بسبب عمليات إعادة التأسيس أو إعادة كتابة سجل آخر أو نسيان بعض الأشخاص استبدال بطارية BIOS أو أي أعمال سحرية أخرى تقوم بها في السجل) فاستخدم البرنامج النصي أعلاه.

للخيار الأخير (تاريخ من العلامة بغض النظر قاعدة الدمج) للحصول على قائمة العلامات مرتبة حسب تاريخ الاستخدام:

$ git log --tags --simplify-by-decoration --pretty="format:%ci %d" | sort -r

للتعرف على تاريخ المراجعة الحالي استخدم:

$ git log --max-count=1

لاحظ أن git describe --tags لها استخدام في الحالات الخاصة بها ولكن ليس للعثور عليها توقع الإنسان أقرب علامة في تاريخ المشروع.

ملحوظة يمكنك استخدام الوصفات المذكورة أعلاه في أي مراجعة، فقط قم باستبدالها HEAD مع ما تريد!

git tag -l ac* | tail -n1

احصل على العلامة الأخيرة مع البادئة "تيار متردد".على سبيل المثال، العلامة المسماة بـ 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 Tag" بدون وسيطات يسرد أيضًا جميع العلامات.النمط عبارة عن بطاقة برية قذيفة (أي ، مطابقة باستخدام 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).

بعد جوجل احدهم قال يدعم git 2.8.0 بناء الجملة التالي.

git tag --sort=committerdate

git describe --abbrev=0 --tags

إذا كنت لا ترى أحدث علامة، فتأكد من جلب الأصل قبل تشغيل ذلك:

git remote update

والأعمال التالية بالنسبة لي في حال كنت بحاجة علامات الماضيين (على سبيل المثال، من أجل توليد سجل التغيير بين العلامة الحالية والعلامة السابقة). لقد اختبرت إلا في الحالة التي تكون فيها أحدث علامة على 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، الذي يسرد كافة الدورات في ترتيب زمني عكسي، بالاشتراك مع git tag --contains. عندما تجد المرجع حيث تنتج git tag --contains قائمة غير فارغ، كنت قد وجدت العلامة الأخيرة (ق).

إذا كنت تريد أن تجد العلامة الأخيرة التي تم تطبيقها على فرع معين يمكنك محاولة ما يلي:

git describe --tag $(git rev-parse --verify refs/remotes/origin/"branch_name")

وهذا هو موضوع قديم، ولكن على ما يبدو الكثير من الناس في عداد المفقودين أبسط وأسهل، والجواب الأكثر الصحيحة على سؤال OP و: للحصول على أحدث شعارا لصفحة فرع الحالي ، أو استخدام git describe HEAD. القيام به.

وتحرير: يمكنك أيضا توريد أي refname ساري المفعول، حتى أجهزة التحكم عن بعد. أي سوف git describe origin/master اقول لكم أحدث العلامة التي يمكن الوصول إليها من أصل / سيد.

للحصول على أحدث علامة فقط على اسم الفرع/العلامة الحالي الذي يسبق الفرع الحالي، كان علي تنفيذ ما يلي

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
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top