git 我如何在不添加自己为提交者的情况下对另一个作者所做的提交进行改基?

jfgube3f  于 2023-05-27  发布在  Git
关注(0)|答案(3)|浏览(164)

通常情况下,当你用git重定另一个作者的提交的基时,git会添加一个Commit:标头,其中包含你的姓名和电子邮件地址。我不希望这种情况发生。我希望重定基的提交以相同的SHA1结束,因为如果原作者已经做了等效的重定基他/她自己。这可能吗?

bxgwgixi

bxgwgixi1#

所有的git提交都有一个内部的committer字段;你可以通过在提交后立即输入git cat-file commit HEAD来看到这一点。这样你就无法抹去它;你只能让它等于作者字段。
也就是说,你可能会看到git porcelain显示commit字段,因为 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),使它们的committer字段在所有方面都与author字段相同。如果原作者同意做同样的事情,那么你就可以得到一个一致的SHA1。

fbcarpbf

fbcarpbf2#

尝试在重定基时设置环境变量GIT_COMMITTER_NAMEGIT_COMMITTER_EMAIL(也可能是GIT_COMMITTER_DATE)。(不过,这将影响现在创建的所有提交。

vbopmzt1

vbopmzt13#

使用Interactive Rebase配合instructionFormat,可以在rebase时保留原始提交者信息。
在配置文件.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-交互式变基的配置,用于在to-do文件中给予自定义指令。
  • %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-一个换行符(在to-do文件中添加一个空行以提高可读性;可以重复更多的空行)。
  • alias.rb-为方便起见,定义了一个别名,用于快速调用git rb [new base]的交互式变基

要使用它,请确保您已在您希望变基的分支上 checkout ,然后运行命令git rb [new base],其中[new base]是您希望在其上变基 checkout 分支的分支或commit-ish。(示例:git rb main
将打开一个编辑器,其中包含交互式变基to-do。只需关闭编辑器(除非您知道自己在做什么并希望编辑它)。* 如果你好奇,你可以在文件中看到上面配置的输出。*

**注1:**这只能通过交互式变基实现,因为常规变基不支持instructionFormat。你必须忍受编辑器在没有好的理由的情况下打开,只需关闭它(如果你没有编辑它的计划)。
**注2:**即使保留所有提交者信息,也可能无法获得相同的SHA1,因为SHA1依赖于父提交。当父节点发生变化时,SHA1也会发生变化。但是,如果父节点没有更改,您将始终获得相同的SHA1。所以这是一个确定性操作。
**注3:**对于Windows,您可能需要使用Git Bash,并且您可能需要将引用\"更改为"""。如果你不需要改变它,发表评论,让我知道。如果您使用WSL 2,则不需要更改它。此外,这在命令提示符和PowerShell中不起作用,因为DOS不支持内联环境变量。

相关问题