如何在不将自己添加为提交者的情况下对其他作者所做的提交进行变基?

问题描述 投票:0回答:3

通常,当您使用 git 对其他作者的提交进行 rebase 时,git 会添加一个

Commit:
标头,其中包含您的姓名和电子邮件地址。我遇到的情况是我不希望这种情况发生。我希望 rebase 提交最终得到与原作者自己进行等效 rebase 相同的 SHA1。这可能吗?

git rebase
3个回答
33
投票

所有 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。


8
投票

尝试在 rebase 时设置环境变量

GIT_COMMITTER_NAME
GIT_COMMITTER_EMAIL
(也可能是
GIT_COMMITTER_DATE
)。 (不过,这将影响现在创建的所有提交。)


2
投票

使用 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 不支持内联环境变量。

© www.soinside.com 2019 - 2024. All rights reserved.