13

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

我更改了系统时钟以测试我的应用程序中的行为,但忘记
git add -u .git push. 现在我的 GitHub 存储库显示了“在一个月内”编辑的多个文件。

我已经遵循了这里的建议——特别是对 OP 的建议的评论git push --force,但不幸的是编辑日期保持不变。

4

2 回答 2

8

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

阅读这篇文章以了解如何修复时间戳:如何在 Git 中更改旧提交的时间戳?

然后用力推。

(顺便说一句,在 github 上,可能需要刷新几次才能看到更改。另外,我假设您知道您正在破坏历史,如果其他人克隆了 repo,您​​破坏了它们等等,对吧?好!)

于 2013-08-01T06:12:26.507 回答
7

您可以尝试 的--date选项git commit,如Alan Kelder的这篇文中所述:

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

以上对于未提交的更改非常有效,但是如果您提交了更改并想修改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共享存储库听起来很混乱,因为您可能会混淆其他人。

于 2013-08-01T06:13:35.840 回答