web-dev-qa-db-ja.com

gitタグ(またはそれに基づいたGitHubリリース)の日付を変更する

Mainブランチのさまざまなコミットにタグを追加することで、GitHubのプロジェクトに Releases を追加しています。

私のプロジェクトの1つでは、時系列順にコミットにタグを追加しませんでした。 (明らかなコミットを見つけてタグ付けし、それからあまり明らかではない、olderコミットしてタグ付けしました。)

現在、 GitHubが表示されています v1.0.1が最新で、v0.7.0が先行し、v1.1.2が先行していますthat

タグ付けされているコミットの代わりに、タグの作成日をリリース日として使用するようです。日付がタグ付けしているコミットと同じになるようにタグを編集するにはどうすればよいですか?

mapping of releases and dates between gitk and GitHub

86
Phrogz

警告:これは、not注釈付きタグのタグメッセージを保持します。

概要

変更する必要のあるタグごとに:

  1. タグを表すコミットに時間をさかのぼります
  2. タグを削除します(ローカルおよびリモート)
    • これにより、GitHubの「リリース」がドラフトになり、後で削除できます。
  3. 日付をコミットの日付に設定するマジック呼び出しを使用して、同じ名前のタグを再度追加します。
  4. 日付が固定された新しいタグをGitHubにプッシュします。
  5. GitHubに移動し、現在作成中のリリースを削除し、新しいタグから新しいリリースを再作成します

コード内:

# 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

詳細

Gitでタグ付けする方法によると:

リリースまたはバージョンバンプのタグ付けを忘れた場合は、いつでも次のように遡及的にタグ付けできます。

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

そして、それは完全に使用可能ですが、「最新」のタグを探すビルドシステムに悪影響を及ぼす可能性のあるタグを時系列順に並べる効果があります。しかし、恐れはありません。 Linusはすべてを考えました:

# 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"

ただし、既にタグを追加している場合は、git tag -f existingtagで上記を使用することはできません。そうしないと、マージしようとするとgitが文句を言います。

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

代わりに、タグをローカルで削除する必要があります。

git tag -d 1.0.1

削除をプッシュ リモートで:

git Push Origin :refs/tags/1.0.1

GitHubで、Releasesを再ロードします(リリースは「ドラフト」としてマークされています)。ドラフトを削除します。

次に、上記の手順に基づいてバックタグを追加し、最後に結果のタグをGitHubにプッシュします。

git Push --tags

その後、GitHubリリース情報を再度追加してください。

106
Phrogz

他の回答のコメントのいくつかに基づいたワンライナーは次のとおりです。

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

警告:これは上流のタグを無効にし、not注釈付きタグのメッセージを保存します!あなたが何をしているかを知っていることを確認し、間違いなくパブリックリポジトリに対してこれをしないでください!!!

分解するには...

# 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

単一のプッシュを使用することを提案してくれた@Mr_and_Mrs_Dに感謝します。

16
vmrob

他の答えに基づいて、ここにwillがタグメッセージの最初の行を保持する方法があります

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

メッセージを保存する役割は次のとおりです。

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

head -n1は、古いコミットメッセージの最初の行を取得します。代わりに-n2または-n3などに変更して、2行または3行を取得できます。

1つのタグの日付/時刻を変更したい場合、これはbashシェルでそれを行うためにワンライナーを分解する方法です:

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

参照:

0
weiji14