Git'te mevcut bir etiket mesajını nasıl düzenlerim?


225

Git depomuzda birkaç açıklamalı etiket var. Eski etiketlerin yeni stilimizde olması için güncellemek istediğimiz sahte mesajlar var.

% git tag -n1
v1.0 message
v1.1 message
v1.2 message
v2.0 Version 2.0 built on 15 October 2011.

Bu örnekte, v1.x mesajlarının v2.0 mesajına benzetilmesini istiyoruz. Bunu nasıl yapacağımızı bilen var mı?


2
Not: Git 2.17 (Q2 2018) ile basit bir git tag -m "A message" --edit v1.0şey yeterli olacaktır. Aşağıdaki cevabımı
VonC


@VonC Denedim ve fatal: tag 'v6.6.2' already existskullanarak aldı 2.17.0.
Josh Habdas

1
Her zaman önceki etiketi silebilir ve tekrar yapabilirsiniz.
RoadRunner

Yanıtlar:


264

git tag <tag name> <tag name>^{} -f -m "<new message>"

Bu, aynı ada sahip yeni bir etiket oluşturur (orijinalin üzerine yazarak).


7
Bu, orijinal etiketin tarihini koruyor mu?
James M. Greene,

16
Kendi comment soruya Cevap: Evet, yok tarihini değiştirin. :(
James M. Greene

10
İçindeki "Backdating Etiketleri Üzerine" bölümüne bakın git tag --help.
dahlbyk

6
Ayrıca birden fazla mesaj ekleyebileceğiniz de unutulmamalıdır (yeni bir satırla ayrılırlar - GitHub'da)git tag <tag name> <tag name> -f -m "<new message>" -m "<new message>" -m "<new message>"
Blair McMillan

5
@ChrisMorley aşağıdaki cevabımın altına bakar stackoverflow.com/a/23532519/603949 - kısaca,<tag name>^{}old tag
Sungam

87

Karmaşık bir mesajı güncellemek için ek açıklama eklenmiş etiket seçeneğini -aveya işaretli etiket seçeneğini belirtin -s:

git tag <tag name> <tag name>^{} -f -a

Bu, eski etiket mesajınızın içeriğini içeren bir düzenleyici açar .


39

git tag <tag name> <tag name>^{} -f -a

Bu bir gelişmedir: olmadan ^{}, her ikisinin de aynı etiket adına sahip olacağı eski etiket nesnesine başvuran yeni bir etiket nesnesi oluşturur.

<tag name>^{} etiketi / başvuruyu ilk sağlama karmasını bulana kadar çözer.


4
@BrentFoust, sadece kafanın etiketli taahhütte olduğu zaman işe usage: git tag [-a|-s|-u <key-id>] [-f] [-m <msg>|-F <file>] <tagname> [<head>]
yarar

33

TL; DR

Bunu, etiketinizi silerek ve tarihi ve yazarı sahtecilik yaparken yeniden oluşturarak yapabilirsiniz:

> git tag -d <tag-name>
> [GIT_COMMITTER_DATE=<original-commit-date>] \
> [GIT_AUTHOR_NAME=<original-author-name>] \
> git tag <tag-name> [commit]

Tüm hikaye:

Bina Sungram bireyin cevabı (aslında bir düzenleme olarak önerilen):

1. Kabul edilen cevap

Bu Andy ve Eric Hu'nun cevapları üzerinde bir gelişme . Yanıtları eski etiket nesnesine başvuran yeni bir etiket nesnesi oluşturacak ve her ikisi de aynı ada sahip olacak.

Bunu göstermek için aşağıdakileri göz önünde bulundurun:

> git tag tag1 tag1 -f -a  # accepted answer
> git rev-list --objects -g --no-walk --all
[ example output: ]
6bdcc347fca041a5138f89fdf5276b3ebf9095d5
260ab7928d986472895b8c55e54569b3f3cb9517 tag1
a5797673f610914a45ef7ac051e3ee831a6e7c25 tag1
f22d6308c3cd330a3b0d86b9bf05562faf6b6f17

> git show tag1
tag tag1
Tagger: [tagger]
Date:   [date of updated tag]
[Updated description]

tag tag1
Tagger: [tagger]
Date:   [date of original tag]
[Original description]

[tagged commit details]

2. Sungram'ın gelişimi

Kullanılması <tag name>^{}ikinci argüman olarak git tagyerine aynı adla önceki tüm etiketlerini silecektir.

Önceki terminal oturumunun devamını düşünün:

> git tag tag1 tag1^{} -f -a  # suggested improvement
> git rev-list --objects -g --no-walk --all
[ example output: ]
6bdcc347fca041a5138f89fdf5276b3ebf9095d5
75f02acacfd7d91d55b5bcfdfb1f00aebeed15e3 tag1
f22d6308c3cd330a3b0d86b9bf05562faf6b6f17 

> git show tag1
tag tag1
Tagger: [tagger]
Date:   [date of updated tag]
[Updated description]

[tagged commit details]

3. Tarihi kaydedin

Son olarak, orijinal etiketin tarihini güncellenen etiketin tarihi olarak tutmak istiyorsanız, biraz awk (veya benzeri) bir sihir kullanın veya bunun yerine istediğiniz tarihi yapıştırın. Aşağıdaki bir olan yedek (Aksi orijinal tarih nedeniyle geçersiz kılma için kaybedilecek) ikinci örneğin:

> GIT_COMMITTER_DATE="$(git show tag1 |                              # get info about the tag cascade including the date original of the original tag
> awk '{
>     if ($1 == "Date:") {
>         print substr($0, index($0,$3))
>     }
> }' |                                                               # extract all the dates from the info
> tail -2 | head -1)"                                               `# get the second to last date, as the last one is the commit date` \
> git tag tag1 tag1^{} -a -f                                         # finally, update the tag message, but save the date of the old one
>
> git rev-list --objects -g --no-walk --all
6bdcc347fca041a5138f89fdf5276b3ebf9095d5
e18c178f2a548b37799b100ab90ca785af1fede0 tag1
f22d6308c3cd330a3b0d86b9bf05562faf6b6f17
> git show tag1
tag tag1
Tagger: [tagger]
Date:   [date of original tag]
[Updated description]

[tagged commit details]

Referanslar:

4. DIY

Alternatif olarak, etiketleri güncellemek için bunları silebilir ve tekrar oluşturabilirsiniz. Güncellemenin yeni bir etiket eklediği ve eskisine işaret ettiği veya alternatif olarak eskisinin örtük olarak silinip yine de aynı taahhüdü işaret etmek için yeni bir etiket oluşturduğu ortaya çıkıyor.

Bunu aşağıdakileri yaparak yapabilirsiniz:

> git tag -d <tag-name>
> [GIT_COMMITTER_DATE=<original-commit-date>] \
> [GIT_AUTHOR_NAME=<original-author-name>] \
> git tag <tag-name> [commit]

İşte [optional]isteğe bağlı bir alan; <required>Zorunlu bir alandır. Tabii ki, git tagnormalde yapacağınız komuttan sonra herhangi bir bayrak ekleyebilirsiniz .


3
"Yanıtlarının yeni bir etiket nesnesi oluşturacağını" belirttiğiniz için teşekkür ederiz!
cwhsu

Alıntı Andreas Schwab : The tagger is controlled by the committer info. (...) GIT_COMMITTER_{NAME,EMAIL}. A tagger isn't really an author.
Ivan Vučica

11

@Andy'nin çözümü

git tag <tag-name> <tag-name> -f -a

olduğu yanlış . Ondan sonra, ile

git show

komutunda aynı ada sahip yığın etiketleri göreceğiz.

İşlem sırasında aynı etiket adına ve yeni iletiye sahip yeni bir etiket ekler <tag-name>. Ancak eski etiketi kaldırmaz. Bu komutun özel bir durumu:

git tag [<commit> | <old-tag>] <tag-name>

Ama sadece <old-tag>aynı <tag-name>.


Doğru çözüm basit, güncelleme etiketi TAMAM.

git tag <tag-name> -f -a

Unutma, burada sadece BİR .

Etiketi değiştirmek istiyorsak, ki bu HEADfazladan bir <commit>tartışmaya ihtiyacımız var .

git tag <commit> <tag-name> -f -a

EVET! Haklısın. Bunu işaret ettiğin için teşekkürler. Birkaç kez açıklamalı etiketi yeniden yazdıktan sonra, etiketimi kontrol ettim git show <tag>ve önceki tüm sürümleri görüyorum.
Manoel Vilela

Sorun şu ki, HEADfazladan geçmeyen bazı etiketi güncellemem gerekiyorsa <commit>, açılan etiket boş. Eski etiketin sadece düzenlemesini bekliyordum. Yolu var mı?
Manoel Vilela

Yanıtladığınızdan bu yana Andy'nin çözümünün güncellendiğini lütfen unutmayın. Belki de cevabınızın düzeltildiğini söyleyen bir mesajla başlamak güzel olurdu? Ayrıca komutunuzda git tag <commit> <tag-name> -f -a<commit> ve <tag-name> tersine çevrilmiş olabilir mi? Diğer cevaplar ve dokümanlar ile karşılaştırıldığında bu şekilde görünüyor, ama ben uzman değilim.
Jacob Akkerboom

7

v1.x mesajlarını v2.0 mesajına benzetmek istiyoruz

Git 2.17 (Q2 2018) ile yeni bir etiket oluşturmanın bir alternatifi olacaktır git tag <tag name> <tag name> -f -m "<new message>", çünkü " git tag" üzerinden verilen iletiye izin veren açık bir " --edit" seçeneği öğrendi "-m " ve " -F" daha fazla düzenlenmesini .

Nicolas Morey-Chaisemartin ( ) tarafından taahhüt edilen 9eed6e4 (06 Şub 2018) bölümüne bakınız . ( Junio ​​C Hamano tarafından birleştirildi -nmorey
gitster - içinde 05d290e taahhüt 2018, 06 Mar)

tag: --editseçenek ekle

Bir ekleme --editsağladığı iletileri değiştirmesini sağlar seçeneği -mya -F, aynı şekilde git commit --edityapar.


4
Lütfen OP'ye --edithitap eden tutarlı bir örnek verebilir misiniz?
Josh Habdas

@JoshHabdas aslında, -f seçeneğini eklemeniz gerekir: --edit sadece mesajın daha fazla düzenlenmesine izin verir.
VonC

Teşekkürler. Yani eğer -fbayrağı da eklenir daha sonra --editsağ mesajı düzenlemek ve zaman damgası değiştirir?
Josh Habdas

@JoshHabdas Fikir bu, evet.
VonC

4

-fKuvvet bayrağını kullanarak tekrar etiketlemeniz gerekecektir .

git tag v1.0 -f -m "actual message"

3
Bu çözüm, geçerli git başlığının sürüm 1.0'da olduğunu varsayar. Bu, sürüm 1.0 ile ilişkili revizyonu değiştirdiği için, değilse, işleri bozabilir. Andy'nin çözümü bu tuzaklardan kaçınır.
Eric O Lebigot

4

Yukarıdaki cevapları kullanarak, bu benim takma adım bir astar .gitconfig. Mevcut etiketi değiştirir ve yayınlanma tarihini korur.

[alias]
    tm = "!sh -c 'f() { export GIT_COMMITTER_DATE=$(git log -1 --format=%ci $0); git tag -f -a $0 $0^{}; }; f '"

İyileştirmeler?


1
Ayrıca yazar tutar: tag-amend = "!sh -c 'f() { name=$(git log -1 --format=%an $0); email=$(git log -1 --format=%ae $0); date=$(git log -1 --format=%ci $0); GIT_AUTHOR_NAME=\"${name}\" GIT_COMMITTER _NAME=\"${name}\" GIT_AUTHOR_EMAIL=\"${email}\" GIT_COMMITTER_EMAIL=\"${email}\" GIT_AUTHOR_DATE=\"${date}\" GIT_COMMITTER_DATE=\"${date}\" git tag -f -a $0 $0^{}; }; f '"
minterior

1
Sadece denedim. Yeni etikete yazar ve tarih bilgisini etiketin kendisinden vermek yerine, etiketin gösterdiği taahhütten gelen bilgileri kullanır. Bu mutlaka aynı değildir ve aslında bizim durumumuz için çoğu zaman aynı değildir. Çoklu repo altyapımız var ve birden fazla depoya yayılan pushlar hakkında bilgi kaydetmek için 'çekirdek' repoda ek açıklamalı etiketler kullanıyoruz. Yani, özünde, işaret edilen taahhüt gerçek itmenin bir parçası bile olmayabilir. Açıklamalı etiketteki bilgiler, diğer depolardaki gerçek itmeleri yansıtmalıdır.
tanager

0

Eğer böyle bir GUI kullanıyorsanız SmartGit sadece

  1. aynı mesajı yeni mesajla aynı konumda tekrar oluştur
  2. "mevcut etiketin üzerine yaz" ı seçin
  3. etiketi yukarı akış deposuna zorla itme
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.