通常,当您使用 git 对其他作者的提交进行 rebase 时,git 会添加一个
Commit:
标头,其中包含您的姓名和电子邮件地址。我遇到的情况是我不希望这种情况发生。我希望 rebase 提交最终得到与原作者自己进行等效 rebase 相同的 SHA1。这可能吗?
所有 git 提交内部都有一个 committer 字段;您可以在提交某些内容后立即输入
git cat-file commit HEAD
来查看这一点。因此您无法删除它;你只能让它等于作者字段。
也就是说,您可能会看到 git Ceramic 显示提交字段,因为 datestamp 已更改。显然,如果其他人进行变基,则无法预测他们会得到什么提交日期时间戳,但您至少可以将其更改为等于原始提交时间戳。
git filter-branch --commit-filter 'export GIT_COMMITTER_NAME="$GIT_AUTHOR_NAME"; export GIT_COMMITTER_EMAIL="$GIT_AUTHOR_EMAIL"; export GIT_COMMITTER_DATE="$GIT_AUTHOR_DATE"; git commit-tree "$@"' -- basecommit..HEAD
这将改变 HEAD 历史记录中的 basecommit 后的提交(包括 HEAD,不包括 basecommit),使其提交者字段在所有方面与作者字段相同。如果原作者同意做同样的事情,那么你可以获得一致的SHA1。
尝试在 rebase 时设置环境变量
GIT_COMMITTER_NAME
和 GIT_COMMITTER_EMAIL
(也可能是 GIT_COMMITTER_DATE
)。 (不过,这将影响现在创建的所有提交。)
使用 Interactive Rebase 和
instructionFormat
进行变基时,您可以保留原始提交者信息。
在您的配置文件
.gitconfig
中,设置:
[rebase]
instructionFormat = %s%nexec GIT_COMMITTER_DATE=\"%cI\" GIT_COMMITTER_NAME=\"%cN\" GIT_COMMITTER_EMAIL=\"%cE\" git commit --amend --no-edit%n
[alias]
rb = rebase --interactive
说明:
rebase.instructionFormat
- 交互式变基的配置,以在待办事项文件中给出自定义指令。%s
- 提交消息的主题(默认值 instructionFormat
)。%n
- 换行符;可以加倍 (%n%n
) 添加一个空行以提高可读性。exec
- 指示 git rebase
将行的其余部分作为 shell 命令执行。
x
(如果您使用 abbreviateCommands = true
则很有用)。GIT_COMMITTER_DATE=\"%cI\"
- 以严格的 ISO 8601 格式获取提交日期。GIT_COMMITTER_NAME=\"%cN\"
- 获取提交者的姓名。GIT_COMMITTER_EMAIL=\"%cE\"
- 获取提交者的电子邮件地址。
.mailmap
文件(如有)。要忽略该文件,请使用 %cn
和 %ce
来代替。git commit --amend --no-edit
- 使用上述三个环境变量修改提交,而不打开提交消息的编辑器。%n
- 换行符(在待办事项文件中添加一个空行以提高可读性;可以重复更多空行)。alias.rb
- 为了方便,定义了一个别名来快速调用交互式变基 git rb [new base]
要使用它,请确保您已在要变基的分支上签出,然后运行命令
git rb [new base]
,其中[new base]
是要在其上变基已检查的分支或提交-ish - 出分支。 (例如:git rb main
)
编辑器将打开,其中包含交互式变基待办事项。 只需关闭编辑器(除非您知道自己在做什么并且想要编辑它)。 如果你好奇,你可以在文件中看到上述配置的输出。
注1: 这只能通过交互式变基实现,因为常规变基不支持
instructionFormat
。你必须忍受编辑器无缘无故地打开,然后关闭它(如果你不打算编辑它)。
注 2: 即使您保留了所有提交者信息,您仍然可能无法获得相同的 SHA1,因为 SHA1 依赖于父提交。当父级发生变化时,SHA1 也会发生变化。但是,如果父级没有更改,您将始终获得相同的 SHA1。所以这是一个确定性操作。
注3:对于Windows,您需要使用Git Bash或WSL2。这在命令提示符和 PowerShell 中不起作用,因为 DOS 不支持内联环境变量。