如何更新git commit author,但在修改时保留原始日期?

时间:2016-12-23 12:33:36

标签: git

如果已经提交并推送到存储库,并且如果想要为某个特定提交更改作者,我可以这样做:

git commit --amend --reset-author

但是,这将改变原始的承诺日期。

如何重置作者,但保留原始提交者日期?

4 个答案:

答案 0 :(得分:5)

您可能会使用其他答案中提到的内容:

git commit --amend --reset-author --no-edit --date="<old-date>"

虽然可行,但需要大量手动复制或键入才能使旧日期正确。您可能希望通过仅获取日志中最后一个条目的日期来自动获取日期:

git log -n 1 --format=%aD

将两者结合起来并使用一些外壳魔术:

git commit --amend --reset-author --no-edit --date="$(git log -n 1 --format=%aD)"

这会自动将日志中最后一次提交的日期(也就是要修改的日期)设置为更改了作者的新提交的日期。

现在更改大量提交者,例如,因为您忘记了在克隆的git repo中设置作者,那么交互式的rebase是您的朋友:

git rebase -i <commit before wrong author and email>

然后将所有要调整的提交从pick更改为edit并保存文件。 Git在每次要编辑的提交上停止,然后重新运行:

git commit --amend --reset-author --no-edit --date="$(git log -n 1 --format=%aD)" && \
    git rebase --continue

如果提交的数量很少,则可以使用shell arrow-up键重复此命令,直到重新建立基准为止。如果提交次数较多,则键入arrow-up + return会变得很繁琐,您可能想创建一个小的Shell脚本,该脚本重复上述命令,直到重新完成基准。

答案 1 :(得分:4)

  1. 如果您正在执行rebase,请使用committer-date-is-author-date保持日期与之前相同。

    $ git commit --amend --committer-date-is-author-date
    
  2. 对于正常修改,请复制original committer time并覆盖使用--date标志进行修改时的时间。

    $ git log                     # copy the 'original-committer-time'
    $ git commit --amend --reset-author --date="<original-committer-time>"
    
    # e.g. git commit --amend --date="Fri Dec 23 18:53:11 2016 +0600"
    

答案 2 :(得分:3)

嗯,最后,我找到了一个更简单的解决方案。我在包含git项目$query = sprintf("SELECT user.* FROM user WHERE user.iduser NOT IN (SELECT idstaff FROM rota WHERE idrota=%s AND idstaff <> NULL)", $this->db->GetSQLValueString($idrota, "int")); 的目录中创建了一个脚本,并修改了它的权限,以便它可以被执行:

@api_view(['POST'])
def search(request, format=None):
    """launches an API search"""

    serializer = SearchSerializer(data=request.data)

然后我放入了shell脚本:

gitrewrite.sh

然后在终端中运行脚本:

$ chmod 700 gitrewrite.sh

就是这样。历史已被重写。

将代码推送到存储库并添加#!/bin/sh git filter-branch --env-filter ' NEW_NAME="MyName" NEW_EMAIL="my-name@my-domain.com" if [ "$GIT_COMMIT" = "afdkjh1231jkh123hk1j23" ] || [ "$GIT_COMMIT" = "43hkjwldfpkmsdposdfpsdifn" ] then export GIT_COMMITTER_NAME="$NEW_NAME" export GIT_COMMITTER_EMAIL="$NEW_EMAIL" export GIT_AUTHOR_NAME="$NEW_NAME" export GIT_AUTHOR_EMAIL="$NEW_EMAIL" fi ' --tag-name-filter cat -- --branches --tags 标记。

$ ./gitrewrite.sh

重要提示:

对于阅读它的其他人,请记住,这将在git历史记录中创建新的引用,所以只在私有存储库中执行此操作,或者仍然不与其他存储库共享,因为它可能导致损坏的引用!

我的是私人回购,所以不用担心那部分。如果它是公开的,那么也许使用其他建议的答案可能是更好的选择。

答案 3 :(得分:1)

我们可以使用rebase autosquash获得所需的行为: example.com/dir1/dir2/etc/hello/?dirs=var1/var2/var3/ example.com/goodbye/?dirs=var1/var2/var3/

警告:如果已经推送了提交,并且如果以任何方式重写推送的提交并强制推送,那么您将重写已发布的历史记录,这通常被视为非常糟糕的事情。如果没有其他人将他们的工作建立在您的提交之上,那么这不是问题。