如果已经提交并推送到存储库,并且如果想要为某个特定提交更改作者,我可以这样做:
git commit --amend --reset-author
但是,这将改变原始的承诺日期。
如何重置作者,但保留原始提交者日期?
答案 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)
如果您正在执行rebase
,请使用committer-date-is-author-date
保持日期与之前相同。
$ git commit --amend --committer-date-is-author-date
对于正常修改,请复制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)
$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/
警告:如果已经推送了提交,并且如果以任何方式重写推送的提交并强制推送,那么您将重写已发布的历史记录,这通常被视为非常糟糕的事情。如果没有其他人将他们的工作建立在您的提交之上,那么这不是问题。