在一个特定的提交中更改提交作者
我想改变历史中某个特定提交的作者。 这不是最后一次提交。
我知道这个问题 - 我如何更改git中提交的作者?
但是我在思考什么,在哪里我通过散列或短散列标识提交。
从历史早期的一个点开始交互重新分配,比你需要修改的提交( git rebase -i <earliercommit>
)。 在重新分配的提交列表中,将文本从pick
更改为您要修改的哈希旁边的edit
。 然后当git提示你改变提交时,使用这个:
git commit --amend --author="Author Name <email@address.com>"
例如,如果您的提交历史记录为ABCDEF
且F
为HEAD
,并且您想要更改C
和D
的作者,那么您会......
git rebase -i B
(这里是你执行git rebase -i B
命令后会看到的一个例子) A
,请使用git rebase -i --root
pick
到edit
更改C
和D
的行 C
暂停 git commit --amend --author="Author Name <email@address.com>"
git rebase --continue
D
再次停顿 git commit --amend --author="Author Name <email@address.com>"
git rebase --continue
这个问题被接受的答案是巧妙地使用了交互式rebase,但是不幸的是,如果我们试图改变原来的作者在后来合并的分支上的提交,那么它就会表现出冲突。更一般地说,它不起作用处理凌乱的历史。
由于我担心运行的脚本依赖于设置和取消设置环境变量来重写git历史记录,因此我正在撰写一个基于此帖子的新答案,它与此答案类似,但更为完整。
以下是测试和工作,不像链接的答案。 假设为了清楚说明03f482d6
是我们试图替换作者的提交, 42627abe
是新作者的提交。
检出我们试图修改的提交。
git checkout 03f482d6
让作者改变。
git commit --amend --author "New Author Name <New Author Email>"
然后检出原始分支。
在本地替换旧的提交。
git replace 03f482d6 42627abe
根据替换重写所有将来的提交。
git filter-branch -- --all
取下更换的清洁。
git replace -d 03f482d6
推送新的历史记录(只有在下面的失败时才使用--force,并且只有在使用git log
和/或git diff
进行完整性检查之后)。
git push --force-with-lease
Github文档包含一个脚本,用于替换分支中所有提交的提交者信息。
#!/bin/sh
git filter-branch --env-filter '
OLD_EMAIL="your-old-email@example.com"
CORRECT_NAME="Your Correct Name"
CORRECT_EMAIL="your-correct-email@example.com"
if [ "$GIT_COMMITTER_EMAIL" = "$OLD_EMAIL" ]
then
export GIT_COMMITTER_NAME="$CORRECT_NAME"
export GIT_COMMITTER_EMAIL="$CORRECT_EMAIL"
fi
if [ "$GIT_AUTHOR_EMAIL" = "$OLD_EMAIL" ]
then
export GIT_AUTHOR_NAME="$CORRECT_NAME"
export GIT_AUTHOR_EMAIL="$CORRECT_EMAIL"
fi
' --tag-name-filter cat -- --branches --tags
链接地址: http://www.djcxy.com/p/1413.html