Git:推送后更改时间戳

时间:2013-08-01 05:54:49

标签: git github

如何(意外地)将提交时间戳推送到远程存储库后如何编辑提交的时间戳?

我更改了系统时钟以测试我的应用中的行为,并忘记在之前将其设置回来 git add -u .git push。现在我的GitHub仓库显示了“在一个月内”编辑过的多个文件。

我已遵循建议here - 特别是对推荐git push --force的OP的评论,但不幸的是编辑日期保持不变。

2 个答案:

答案 0 :(得分:5)

好吧,那篇文章是关于更改提交消息,然后强制推送更改。但在这种情况下,您首先需要在执行git push --force之前修复提交时间戳。

阅读本文,了解如何修复时间戳:How can one change the timestamp of an old commit in Git?

然后强行推动。

(顺便说一句,在github上,你可能需要一些刷新才能看到变化。另外,我假设你知道你打破了历史,如果有人克隆了回购,你打破了它们等等,对吧?好!)

答案 1 :(得分:5)

您可以尝试git commit--date选项,如blog post Alan Kelder中{{3}}所述:

修改/重置已提交更改的时间戳

  

以上内容适用于未提交的更改,但如果您提交了更改并希望修改AuthorDate时间,该怎么办?同样,git使上次提交变得容易:

$ git commit --amend --date='<see documentation for formats>' -C HEAD

修改/重置几个已提交的更改的时间戳

  

但是如果你需要返回几个提交怎么办?我也遇到了这种情况,并使用以下Bash脚本重置AuthorDate时间,这是它的作用。

     

对于文件列表,它将获取每个文件的最后一次提交的哈希值,获取文件的最后修改日期,然后将作者时间戳重置为文件的实际修改日期。一定要从工作树的顶层运行它(如果你不这样做,git就会抱怨)。

files="
foo.txt
bar.txt
"

for file in $files; do
  dir=""; commit=""; date="";
  dir=$(dirname $(find -name $file))
  commit=$(git --no-pager log -1 --pretty=%H -- path "$dir/$file")
  date="$(stat -c %y $dir/$file)"
  if [ -z "$commit" ] || [ -z "$date" ]; then
    echo "ERROR: required var \$commit or \$date is empty"
  else
    echo "INFO: resetting authorship date of commit '$commit' for file '$dir/$file' to '$date'"
    git filter-branch --env-filter \
      "if test \$GIT_COMMIT = '$commit'; then
         export GIT_AUTHOR_DATE
         GIT_AUTHOR_DATE='$date'
       fi" &&
    rm -fr "$(git rev-parse --git-dir)/refs/original/"
  fi
  echo
done
  

您可以使用上述脚本重置AuthorDateCommitDate(只需使用下面参考中的示例将GIT_COMMITTER_DATE添加到上面的代码中。)
  虽然修改共享存储库的CommitDate听起来很麻烦,因为你可能会让别人感到困惑。