当前位置:  开发笔记 > 编程语言 > 正文

如何在Git中更改旧提交的时间戳?

如何解决《如何在Git中更改旧提交的时间戳?》经验,为你挑选了15个好方法。

如何修改现有的,未删除的提交的答案?描述了一种修改先前尚未向上游推送的提交消息的方法.新消息继承原始提交的时间戳.这似乎合乎逻辑,但有没有办法重新设定时间?



1> Paul Pladijs..:

您可以执行交互式rebase,并为要更改其日期的提交选择编辑.当rebase进程停止修改提交时,例如:

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

然后继续交互式rebase.

更新(响应studgeek的评论):更改提交日期而不是作者日期:

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

上面的行设置了一个环境变量GIT_COMMITTER_DATE,用于修改提交.

一切都在Git Bash中测试过.


@nschum --date =""和--data"非日期文本"都是相同的,取现在的日期.
在git版本1.7.7.1上使用--date ="now"给出了致命:无效的日期格式:现在
而不是导出GIT_COMMITTER_DATE ="",而是尝试取消设置GIT_COMMITTER_DATE.
当您想要更改其日期的提交是最近的提交时,您不必执行`rebase`,您可以只执行`git commit --amend`

2> Dustin..:

使用git filter-branch与ENV筛选GIT_AUTHOR_DATE,并GIT_COMMITTER_DATE为提交具体的哈希你正在寻找修复.

这将使该和所有未来的哈希失效.

例:

如果你想更改提交的日期119f9ecf58069b265ab22f1f97d2b648faf932e0,你可以这样做:

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'


你是什​​么意思"这会使这个和所有未来的哈希失效."?
EpicDavi:这意味着您必须强制推送到任何远程存储库,任何已经撤消提交或任何未来提交的人都必须从头开始重置和提取或删除和克隆.据我所知,没有办法解决这个问题.
那**找到了**正确的值,但只是设置这些变量实际上似乎并没有影响旧提交的日期.
请参阅"日期格式"https://www.kernel.org/pub/software/scm/git/docs/git-commit.html
就像给初学者的注释一样,短散列在if语句中不起作用,请使用长SHA-1

3> Luke Ehresma..:

在一个命令中处理所有这些建议的更好方法是

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

这会将最后一次提交的提交和作者日期设置为"现在".


这只有在最后一次提交时才有效.
这非常适合在交互式rebase期间编辑特定提交.
似乎Git不是日期格式的语言环境,所以要完全正确,你必须做到这样:`LANG = GIT_COMMITTER_DATE ="\`date \`"git commit --amend - 日期"\`date \`"`
您也可以只执行`--date“ now”`。Git> = 2将解释这一点。

4> Miguel de Va..:

做吧git commit --amend --reset-author --no-edit.对于较旧的提交,您可以执行交互式rebase并选择edit要修改其日期的提交.

git rebase -i 

然后使用--reset-author和修改提交--no-edit将作者日期更改为当前日期:

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

最后继续使用您的交互式rebase:

git rebase --continue


好好打电话使用`--reset-author`,这是git 1.6.6中的新功能(参考https://gitlog.wordpress.com/2010/01/13/git-1-6-6/)
注意`--reset-author`会将Author和Author Date重置为现在。

5> bigpotato..:

我为此写了一个脚本和Homebrew包.超级易于安装,您可以在GitHub PotatoLabs/git-redate页面上找到它.

句法:

git redate -c 3

你只需要运行git redate,你就可以编辑最近5次提交的vim中的所有日期(还有一个-c选项可以让你想要返回多少次提交,它只是默认为5).如果您有任何问题,意见或建议,请与我们联系!

在此输入图像描述


完全同意Mina和@howdoyouturnthison这里,为什么不通过EDITOR环境变量让它与编辑器无关?(我也是在linux上,而不是mac ...)
谢谢@Edmund!以防万一,您的脚本在处理COMMITS的默认值时遇到问题.如果未设置,则以下代码仅对(我猜/发现)最后一次提交应用过滤器."git filter-branch -f --env-filter"$ ENVFILTER"HEAD~ $ COMMITS..HEAD>/dev/null"

6> Ortomala Lok..:

每个提交都与两个日期相关联,即提交者日期和作者日期.您可以使用以下方式查看这些日

git log --format=fuller

如果要更改最近6次提交的作者日期和提交者日期,可以使用交互式rebase:

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"

第一个日期是提交日期,第二个日期是作者日期.

然后转到下一个提交:

git rebase --continue

重复此过程,直到您修改所有提交.检查你的进展git status.



7> VonC..:

在theosp的答案的基础上,我写了一个名为git-cdc(更改日期提交)的脚本,我把它放在我的PATH.

名称很重要:git-xxxPATH可以在任何地方输入:

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天前.


Ilya Semenov 在评论中提到:

对于OS X,您还可以安装GNU coreutils(brew install coreutils),将其添加到PATH(PATH="/usr/local/opt/coreutils/libexec/gnubin:$PATH")然后使用" 2 days ago"语法.


对于OS X,您还可以安装GNU coreutils(`brew install coreutils`),将其添加到PATH(`PATH ="/ usr/local/opt/coreutils/libexec/gnubin:$ PATH"`),然后使用"2天以前的"语法.
在OSX shell中等效的日期命令是什么?

8> Harald Nordg..:
git commit --amend --date="now"



9> Sérgio..:

如果它是前一次提交.

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

如果你已经推送到orgin并且可以强制使用:

git push --force 

如果你不能强制推送,如果它被推,你不能改变提交!.



10> eold..:

这是一个方便的别名,它将上次提交的提交和作者时间更改为接受的时间date --date:

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

用法: git cd

例子:

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



11> theosp..:

以下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"
}



12> 小智..:

我创建了这个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]



13> Jan H..:

要更改作者日期和提交日期:

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



14> Mr_and_Mrs_D..:

如果你想获得另一个提交的确切日期(比如你修改了一个提交并希望它具有原始pre-rebase版本的日期):

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

这纠正头部的日期提交要准确提交a383243之日起(包括多个数字,如果有不清楚的地方).它还会弹出一个编辑器窗口,以便您可以编辑提交消息.

这是作者日期,这是你通常关心的 - 请参阅提交者日期的其他答案.



15> Peter..:

如果要在标准Windows命令行中执行接受的答案(/sf/ask/17360801/),则需要以下命令:

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支持使用carret符号进行行拆分^),但是我没有成功。

您可以编写ISO日期,从而节省大量时间来查找正确的星期几,并使元素顺序普遍受挫。

如果您希望作者和提交者的日期相同,则可以引用先前设置的变量。

非常感谢Colin Svingen的博客文章。即使他的代码对我不起作用,它也帮助我找到了正确的解决方案。

推荐阅读
云聪京初瑞子_617
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有