web-dev-qa-db-ja.com

Gitで古いコミットのタイムスタンプを変更するにはどうすればいいですか?

への回答 - 既存のコミットされていないコミットを変更するにはどうすればいいですか? まだ上流にプッシュされていない以前のコミットメッセージを修正する方法を説明する。新しいメッセージは元のコミットのタイムスタンプを継承します。これは論理的に思えますが、時間を再設定する方法はありますか?

636
Dhskjlkakdh

修正しようとしているコミットの特定のハッシュにgit filter-branchGIT_AUTHOR_DATEを設定するenvフィルタと一緒にGIT_COMMITTER_DATEを使用します。

これにより、それ以降のすべてのハッシュが無効になります。

例:

コミット119f9ecf58069b265ab22f1f97d2b648faf932e0dates を変更したい場合は、次のようにして変更できます。

git filter-branch --env-filter \
    'if [ $GIT_COMMIT = 119f9ecf58069b265ab22f1f97d2b648faf932e0 ]
     then
         export GIT_AUTHOR_DATE="Fri Jan 2 21:38:53 2009 -0800"
         export GIT_COMMITTER_DATE="Sat May 19 01:01:01 2007 -0700"
     fi'
476
Dustin

対話的なリベースをして、日付を変更したいコミットに対して edit を選択することができます。たとえば、入力したコミットを修正するためにリベースプロセスが停止した場合は、次のように入力します。

git commit --amend --date="Wed Feb 16 14:00 2011 +0100"

その後は、対話的なリベースを続けます。

_ update _ (studgeekのコメントに応えて):作成者日付の代わりにコミット日を変更する:

GIT_COMMITTER_DATE="Wed Feb 16 14:00 2011 +0100" git commit --amend

上記の行は、修正コミットで使用される環境変数GIT_COMMITTER_DATEを設定します。

すべてがGit Bashでテストされています。

677
Paul Pladijs

1つのコマンドでこれらの提案をすべて処理するためのより良い方法は、

LC_ALL=C GIT_COMMITTER_DATE="$(date)" git commit --amend --no-edit --date "$(date)"

これにより、最後のコミットのコミットおよび作成者の日付が「今すぐ」に設定されます。

354
Luke Ehresman

git commit --amend --reset-author --no-editを実行するだけです。より古いコミットでは、対話的なリベースを行い、日付を変更したいコミットにeditを選択することができます。

git rebase -i <ref>

それから--reset-author--no-editでコミットを修正して、作成者の日付を現在の日付に変更します。

git commit --amend --reset-author --no-edit

最後に対話的なリベースを続けます。

git rebase --continue
148

そのためのスクリプトと自作パッケージを書きました。インストールがとても簡単で、GitHub PotatoLabs/git-redate ページで見つけることができます。

構文:

git redate -c 3

git redateを実行するだけで、最近の5つのコミットのすべての日付を編集することができます(何回コミットするかのための-cオプションもあります。デフォルトは5です)。ご質問、ご意見、ご提案がありましたらお知らせください。

enter image description here

94
Edmund

各コミットは、2つの日付、コミッター日付と作成者日付に関連付けられています。あなたはこれらの日付を見ることができます:

git log --format=fuller

最後の6つのコミットの作成者日付とコミッター日付を変更したい場合は、単純に対話式リベースを使用することができます。

git rebase -i HEAD~6

pick c95a4b7 Modification 1
pick 1bc0b44 Modification 2
pick de19ad3 Modification 3
pick c110e7e Modification 4
pick 342256c Modification 5
pick 5108205 Modification 6

# Rebase eadedca..5108205 onto eadedca (6 commands)
#
# Commands:
# p, pick = use commit
# r, reword = use commit, but edit the commit message
# e, edit = use commit, but stop for amending
# s, squash = use commit, but meld into previous commit
# f, fixup = like "squash", but discard this commit's log message
# x, exec = run command (the rest of the line) using Shell
# d, drop = remove commit

日付を変更したいすべてのコミットについては、pickedit(または単にe)に置き換えてから、保存してエディターを終了します。

ISO-8601形式で作成者の日付とコミッターの日付を指定することで、各コミットを修正できます。

GIT_COMMITTER_DATE="2017-10-08T09:51:07" git commit --amend --date="2017-10-08T09:51:07"

最初の日付はコミット日、2番目の日付は作成者日付です。

次のコマンドで次のコミットに進みます。

git rebase --continue

すべてのコミットを修正するまでこのプロセスを繰り返します。進行状況をgit statusで確認してください。

75
Ortomala Lokni

theospanswer を土台にして、私は自分のPATHに入れるgit-cdc(変更日コミット用)と呼ばれるスクリプトを書きました。

名前は重要です。PATH内の任意の場所にgit-xxxを入力すると、次のように入力できます。

git xxx
# here
git cdc ... 

そのスクリプトは、Windows上でもbashです(Gitは msys環境から呼び出します )。

#!/bin/bash
# commit
# date YYYY-mm-dd HH:MM:SS

commit="$1" datecal="$2"
temp_branch="temp-rebasing-branch"
current_branch="$(git rev-parse --abbrev-ref HEAD)"

date_timestamp=$(date -d "$datecal" +%s)
date_r=$(date -R -d "$datecal")

if [[ -z "$commit" ]]; then
    exit 0
fi

git checkout -b "$temp_branch" "$commit"
GIT_COMMITTER_DATE="$date_timestamp" GIT_AUTHOR_DATE="$date_timestamp" git commit --amend --no-edit --date "$date_r"
git checkout "$current_branch"
git rebase  --autostash --committer-date-is-author-date "$commit" --onto "$temp_branch"
git branch -d "$temp_branch"

それで、あなたはタイプすることができます:

git cdc @~ "2014-07-04 20:32:45"

これにより、HEAD(@~)より前のコミットの作成者/コミット日が指定の日付にリセットされます。

git cdc @~ "2 days ago"

それはHEAD(@~)の前のコミットの作成者/コミット日を同じ時間に、しかし2日前にリセットします。


イリヤ・セメノフ メンション コメント中

OS Xの場合、GNU coreutilsbrew install coreutils)をインストールし、それをPATHPATH="/usr/local/opt/coreutils/libexec/gnubin:$PATH")に追加してから "2 days ago"構文を使用することもできます。

41
VonC
git commit --amend --date="now"
26
Harald Nordgren

これは最後のコミットの日付(タイムスタンプ)を変更します

git commit --amend --date "Thu May 28 18:21:46 2015 +0530"

26
Nishant

前回の最後のコミットであれば。

git rebase  -i HEAD~2
git commit --amend --date=now

もしあなたがすでにorginにプッシュしていて強制的に使うことができるのなら:

git Push --force 

あなたがプッシュを強制できないならば、そしてそれがプッシュされるならば、あなたはコミットを変更することはできません! 。

18
Sérgio

最後のコミットのコミット時刻と作成者時刻の両方をdate --dateで受け入れられる時刻に変更する便利な別名があります。

[alias]
    cd = "!d=\"$(date -d \"$1\")\" && shift && GIT_COMMITTER_DATE=\"$d\" \
            git commit --amend --date \"$d\""

使用法:git cd <date_arg>

例:

git cd now  # update the last commit time to current time
git cd '1 hour ago'  # set time to 1 hour ago

編集: これは、インデックスがクリーンであること(未コミットの変更がないこと)をチェックし、最後のコミットメッセージを再利用するか、そうでなければ失敗する(絶対確実)より自動化されたバージョンです。

[alias]
    cd = "!d=\"$(date -d \"$1\")\" && shift && \
        git diff-index --cached --quiet HEAD --ignore-submodules -- && \
        GIT_COMMITTER_DATE=\"$d\" git commit --amend -C HEAD --date \"$d\"" \
        || echo >&2 "error: date change failed: index not clean!"
15
eold

次のbash関数は現在のブランチに対するコミットの時間を変更します。

すでにコミットをプッシュした場合や、別のブランチでコミットを使用した場合は、使用しないように注意してください。

# rewrite_commit_date(commit, date_timestamp)
#
# !! Commit has to be on the current branch, and only on the current branch !!
# 
# Usage example:
#
# 1. Set commit 0c935403 date to now:
#
#   rewrite_commit_date 0c935403
#
# 2. Set commit 0c935403 date to 1402221655:
#
#   rewrite_commit_date 0c935403 1402221655
#
rewrite_commit_date () {
    local commit="$1" date_timestamp="$2"
    local date temp_branch="temp-rebasing-branch"
    local current_branch="$(git rev-parse --abbrev-ref HEAD)"

    if [[ -z "$date_timestamp" ]]; then
        date="$(date -R)"
    else
        date="$(date -R --date "@$date_timestamp")"
    fi

    git checkout -b "$temp_branch" "$commit"
    GIT_COMMITTER_DATE="$date" git commit --amend --date "$date"
    git checkout "$current_branch"
    git rebase "$commit" --onto "$temp_branch"
    git branch -d "$temp_branch"
}
10
theosp

私はこのnpmパッケージを作成して、古いコミットの日付を変更しました。

https://github.com/bitriddler/git-change-date

使用例

npm install -g git-change-date
cd [your-directory]
git-change-date

変更したいコミットを選択してから新しい日付を入力するように指示されます。

特定のハッシュによってコミットを変更したい場合は、このgit-change-date --hash=[hash]を実行してください。

9

別のコミットの正確な日付を取得したい場合(コミットをリベース編集し、元のリベース前のバージョンの日付を保持したいとします)。

git commit --amend --date="$(git show -s --format=%ai a383243)"

これにより、HEAD commitの日付が 正確に / a383243のコミット日に修正されます(あいまいさがある場合は、さらに数字を含めます)。コミットメッセージを編集できるように、エディタウィンドウもポップアップします。

それはあなたが通常気にしているものである作者日付のためのものです - コミッター日付のための他の答えを見てください。

8
Mr_and_Mrs_D

作成者日とコミット日の両方を変更するには

GIT_COMMITTER_DATE="Wed Sep 23 9:40 2015 +0200" git commit --amend --date "Wed Sep 23 9:40 2015 +0200"
7
Jan H

標準のWindowsコマンドラインで承認された回答( https://stackoverflow.com/a/454750/72809 )を実行する場合は、次のコマンドが必要です。

git filter-branch -f --env-filter "if [ $GIT_COMMIT = 578e6a450ff5318981367fe1f6f2390ce60ee045 ]; then export GIT_AUTHOR_DATE='2009-10-16T16:00+03:00'; export GIT_COMMITTER_DATE=$GIT_AUTHOR_DATE; fi"

ノート:

  • コマンドを複数行に分割することは可能かもしれませんが(Windowsはキャレット記号^を使った行分割をサポートしています)、私は成功しませんでした。
  • ISOの日付を書くことができるので、正しい曜日を見つけるための時間と、要素の順序に関する一般的な欲求不満を見つけるのに多くの時間を節約できます。
  • 作成者とコミッターの日付を同じにしたい場合は、以前に設定した変数を参照するだけです。

Colin Svingenの ブログ投稿に感謝します 。彼のコードが私にはうまくいかなかったとしても、それは私が正しい解決策を見つけるのを助けました。

4
Peter

素晴らしい答えはたくさんありますが、1日または1か月以内に複数のコミットの日付を変更したい場合、正しい答えが見つかりません。それで私は説明付きでこれのための新しいスクリプトを作成します。それが誰かに役立つことを願っています:

#!/bin/bash

# change GIT_AUTHOR_DATE for commit at Thu Sep 14 13:39:41 2017 +0800
# you can change the data_match to change all commits at any date, one day or one month
# you can also do the same for GIT_COMMITTER_DATE

git filter-branch --force --env-filter '

date_match="^Thu, 14 Sep 2017 13+"              

# GIT_AUTHOR_DATE will be @1505367581 +0800, Git internal format 
author_data=$GIT_AUTHOR_DATE;                   
author_data=${author_data#@}                  
author_data=${author_data% +0800}                # author_data is 1505367581     

oneday=$((24*60*60))

# author_data_str will be "Thu, 14 Sep 2017 13:39:41 +0800", RFC2822 format
author_data_str=`date -R -d @$author_data`      

if [[ $author_data_str =~ $date_match ]];
then
    # remove one day from author_data
    new_data_sec=$(($author_data-$oneday))
    # change to git internal format based on new_data_sec
    new_data="@$new_data_sec +0800"             
    export GIT_AUTHOR_DATE="$new_data"
fi
' --tag-name-filter cat -- --branches --tags

日付は変更されます。

AuthorDate: Wed Sep 13 13:39:41 2017 +0800
1
detective0922

コミットがまだプッシュされていない場合は、次のようにします。git commit --amend --date = "Wed Mar 25 10:05:44 2020 +0300"その後、git bashはすでに適用されている日付でエディタを開きます。 VIエディタのコマンドモードで ":wq"と入力して保存するとプッシュできます。

0
Alex Tsumarau