Git etiketinin tarihini değiştirin (veya buna göre GitHub Yayınını)


97

Ben ekliyorum Bültenleri Ana dalında çeşitli kaydedilmesini etiket ekleyerek GitHub'dan benim projelerine.

Projelerimden birinde etiketleri kronolojik sıraya göre taahhütlere eklemedim. (Bariz kayıtlar buldum ve onları etiketledim ve sonra daha az belirgin, daha eski kayıtlar buldum ve onları etiketledim.)

Şimdi GitHub gösteriyor ondan önceki v0.7.0 ile şu anda olduğu gibi v1.0.1 ve v1.1.2 önceki o .

Görünüşe göre, etiketlenen kayıt yerine Yayın tarihi olarak etiketin oluşturulma tarihi kullanılıyor. Etiketlerimi, tarihleri ​​etiketledikleri kaydetme ile aynı olacak şekilde nasıl düzenleyebilirim?

gitk ve GitHub arasında sürümlerin ve tarihlerin eşlenmesi

Yanıtlar:


120

UYARI: Bu olacak değil açıklamalı etiketleri için etiket iletilerin korunacağı.

Özet

Değiştirilmesi gereken her etiket için:

  1. Etiketi temsil eden işleme için zamanda geri gidin
  2. Etiketi silin (yerel olarak ve uzaktan)
    • Bu, GitHub'daki "Sürümünüzü" daha sonra silebileceğiniz bir Taslağa dönüştürecektir.
  3. Tarihini kaydetme tarihine ayarlayan sihirli bir çağrı kullanarak aynı adlı etiketi yeniden ekleyin.
  4. Sabit tarihlere sahip yeni etiketleri GitHub'a geri gönderin.
  5. GitHub'a gidin, taslak halindeki tüm sürümleri silin ve yeni etiketlerden yeni sürümleri yeniden oluşturun

Kodda:

# Fixing tag named '1.0.1'
git checkout 1.0.1               # Go to the associated commit
git tag -d 1.0.1                 # Locally delete the tag
git push origin :refs/tags/1.0.1 # Push this deletion up to GitHub

# Create the tag, with a date derived from the current head
GIT_COMMITTER_DATE="$(git show --format=%aD | head -1)" git tag -a 1.0.1 -m"v1.0.1"

git push --tags                  # Send the fixed tags to GitHub

Detaylar

Git'te Nasıl Etiketleneceğine Göre :

Bir sürümü veya sürüm çarpmasını etiketlemeyi unutursanız, bunu her zaman şu şekilde geriye dönük olarak etiketleyebilirsiniz:

git checkout SHA1_OF_PAST_COMMIT
git tag -m"Retroactively tagging version 1.5" v1.5

Ve bu mükemmel bir şekilde kullanılabilir olsa da, etiketlerinizi kronolojik sıranın dışına yerleştirme etkisine sahiptir ve bu, "en son" etiketi arayan yapı sistemleriyle uğraşabilir. Ama korkmayın. Linus her şeyi düşündü:

# This moves you to the point in history where the commit exists
git checkout SHA1_OF_PAST_COMMIT

# This command gives you the datetime of the commit you're standing on
git show --format=%aD  | head -1

# And this temporarily sets git tag's clock back to the date you copy/pasted in from above
GIT_COMMITTER_DATE="Thu Nov 11 12:21:57 2010 -0800" git tag -a 0.9.33 -m"Retroactively tagging version 0.9.33"

# Combining the two...
GIT_COMMITTER_DATE="$(git show --format=%aD  | head -1)" git tag -a 0.9.33 -m"Retroactively tagging version 0.9.33"

Ancak, etiketi zaten eklediyseniz, yukarıdakileri ile kullanamazsınız, git tag -f existingtagyoksa git birleştirmeye çalıştığınızda şikayet eder:

Rammy:docubot phrogz$ git push --tags
To git@github.com:Phrogz/docubot.git
 ! [rejected]        1.0.1 -> 1.0.1 (already exists)
error: failed to push some refs to 'git@github.com:Phrogz/docubot.git'
hint: Updates were rejected because the tag already exists in the remote.

Bunun yerine etiketi yerel olarak kaldırmanız gerekir:

git tag -d 1.0.1

Bu silme işlemini uzaktan itin :

git push origin :refs/tags/1.0.1

GitHub'da Sürümleri yeniden yükleyin — sürüm artık "Taslak" olarak işaretlendi - ve taslağı kaldırın.

Şimdi, yukarıdaki talimatlara göre eski tarihli etiketi ekleyin ve son olarak ortaya çıkan etiketi GitHub'a gönderin:

git push --tags

ve sonra gidin ve GitHub Sürüm bilgilerini yeniden ekleyin.


2
İşte bir git git tag -l | while read -r tag; do `git checkout $tag && git tag -d $tag && git push origin :refs/tags/$tag && GIT_COMMITTER_DATE="$(git show --format=%aD | head -1)" git tag -a $tag -m"$tag"`; done; git push --tags
deposundaki

2
kullanmak gereksiz git tag -afhale getirir -dve yerel kalırsınız, böylece her şeyin git push --tags -f
yolunda

Teşekkürler @vmrob, işe yaradı (yine de GitHub şifremi birkaç kez girmek zorunda kaldım).
Colonel Panic

3
@Mr_and_Mrs_D İyi bir öneri ve bu işlemi tek dokunuşla sınırlamanın iyi bir yolu. O akıl ile, ben sonuçlanan (denenmemiş) tek satırlık olacağını düşünüyorumgit tag -l | while read -r tag ; do COMMIT_HASH=$(git rev-list -1 $tag) && GIT_COMMITTER_DATE="$(git show $COMMIT_HASH --format=%aD | head -1)" git tag -a -f $tag -m"$tag" $COMMIT_HASH ; done && git push --tags --force
vmrob

2
Bu, PowerShell için git $env:GIT_COMMITTER_DATE="Thu Nov 11 12:21:57 2010 -0800"git tag -a 0.9.33 -m"Retroactively tagging version 0.9.33"
shell'de

18

İşte diğer cevaptaki bazı yorumlara dayanan tek satırlık bir açıklama:

git tag -l | while read -r tag ; do COMMIT_HASH=$(git rev-list -1 $tag) && GIT_COMMITTER_DATE="$(git show $COMMIT_HASH --format=%aD | head -1)" git tag -a -f $tag -m"$tag" $COMMIT_HASH ; done && git push --tags --force

UYARI: Bu memba etiketleri nuke ve olacak değil açıklamalı etiketler için mesajlar korumak! Ne yaptığınızı bildiğinizden emin olun ve KESİNLİKLE bunu halka açık bir depo için yapmayın !!!

Parçalamak için ...

# Loop over tags
git tag -l | while read -r tag
do

    # get the commit hash of the current tag
    COMMIT_HASH=$(git rev-list -1 $tag)

    # get the commit date of the tag and create a new tag using
    # the tag's name and message. By specifying the environment
    # environment variable GIT_COMMITTER_DATE before this is
    # run, we override the default tag date. Note that if you
    # specify the variable on a different line, it will apply to
    # the current environment. This isn't desired as probably
    # don't want your future tags to also have that past date.
    # Of course, when you close your shell, the variable will no
    # longer persist.
    GIT_COMMITTER_DATE="$(git show $COMMIT_HASH --format=%aD | head -1)" git tag -a -f $tag -m"$tag" $COMMIT_HASH


done

# Force push tags and overwrite ones on the server with the same name
git push --tags --force

Tek bir itme kullanma önerisi için @Mr_and_Mrs_D'ye teşekkürler.


3

Diğer cevaplar üzerine kurulan burada bir yolu olacaktır etiket mesajının ilk satırı korumak

git tag -l | while read -r tag ; do COMMIT_HASH=$(git rev-list -1 $tag) COMMIT_MSG=$(git tag -l --format='%(contents)' $tag | head -n1) && GIT_COMMITTER_DATE="$(git show $COMMIT_HASH --format=%aD | head -1)" git tag -a -f $tag -m"$COMMIT_MSG" $COMMIT_HASH ; done
git tag -l -n1           #check by listing all tags with first line of message
git push --tags --force  #push edited tags up to remote

Mesajları korumaktan sorumlu bit şudur:

COMMIT_MSG=$(git tag -l --format='%(contents)' $tag | head -n1)

head -n1eski commit mesajının ilk satırını alacaktır. Bunun yerine iki veya üç satır elde etmek için -n2veya -n3vb. Olarak değiştirebilirsiniz .

Tek bir etiketin tarih / saatini değiştirmek istiyorsanız, tek satırda bunu bash kabuğunuzda yapmak için şu şekilde ayırabilirsiniz:

tag=v0.1.0
COMMIT_HASH=$(git rev-list -1 $tag)
COMMIT_MSG=$(git tag -l --format='%(contents)' $tag | head -n1)
COMMIT_DATE=$(git show $COMMIT_HASH --format=%aD | head -1)
GIT_COMMITTER_DATE=$COMMIT_DATE git tag -s -a -f $tag -m"$COMMIT_MSG" $COMMIT_HASH

Referanslar:


Bu harika, teşekkürler. Tek bir etiketi değiştirme komutlarında, tek satırda -solmayan bir bayrak var, bu yüzden alıyordum error: gpg failed to sign the dataçünkü git için kaydolma ayarım yok. Bu hata beni bir süreliğine mahvetti.
wch
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.