Git rebase 保留提交者

7

显然,当发生变基时,提交者信息可能会更改。如何在变基时保留提交者信息(user.name、user.email)最好的方法是什么?

我已经尝试使用git log -1 --format="%cngit log -1 --format=%ce获取提交者信息,然后将其设置为我的user.name/user.email并进行变基。这样应该足够了,对吗?还是我漏掉了什么?


你提出的解决方案就是我会做的。 - Guildenstern
3个回答

4
我有类似的问题。我们的核心代码仓库变得太大,所以我使用git filter-branch进行拆分,但是这会在较小的仓库中创建很多空的合并提交。为了尝试删除它们,我发现git rebase会破坏COMMITTER_DATE和COMMITTER_NAME/EMAIL,这意味着我重新设置的任何分支不再链接回它们来自的提交,即使没有任何更改,这意味着我可以获得具有相同提交但不再相同的很多分支。

看起来情况是这样的:无论出于意外还是设计,如果您想保留提交中的所有三个GIT_COMMITTER环境变量,则git rebase不是答案,请改用git filter-branch(这似乎允许您完全重写提交,只更改提交中提到的一个事项)。不幸的是,这不如git rebase -i那么容易。

在我的情况下,我正在尝试从分支历史记录中删除特定的提交或重新排序提交。


3

你可以先像平常一样进行rebase,然后在第二次运行时使用git filter-repo将每个提交的提交者设置为该提交的作者:

git filter-repo --commit-callback '
    commit.committer_name = commit.author_name;
    commit.committer_email = commit.author_email;'

虽然这种方法不被鼓励且比git filter-repo慢得多,但也可以使用git filter-branch来完成此任务:

git filter-branch --commit-filter '
    GIT_COMMITTER_NAME="$GIT_AUTHOR_NAME";
    GIT_COMMITTER_EMAIL="$GIT_AUTHOR_EMAIL";
    git commit-tree "$@"' HEAD

感谢您的回答。为了澄清一下,上面的git filter-repo命令是应用于分支上的所有提交还是只应用于最近由rebase操作影响的提交?如果是全部提交,如何将其限制在一个范围commit_hash..HEAD内? - undefined
1
@A.L. 是的,默认情况下,它会重写存储库中的所有提交。根据 git-filter-repo 文档 的说明,可以使用 --refs commit_hash..HEAD 选项来限制提交范围。 - undefined

2
你到底想要达成什么目标?我猜你这样做是为了让一个分支或一组提交看起来与另一个分支或一组提交完全相同。重新设置基础不会创建全新的提交,因为它们是在不同的时间由不同的提交者完成的。除非你使所有内容(包括元数据)与原始提交完全相同,否则 SHA-1 哈希值将不同 - 如果你想这样做,那么你可能还不如使用原始提交而不是重新设置基础后的提交。所以我认为重新设置基础不会得到你想要的结果。经过简短的谷歌搜索,似乎你想做的事情并不容易完成,也可能有很好的理由。这就是我的回答 - 不要做你想做的事情,我不知道这会有什么好处。
如果你仍然想调查,我建议你研究一下 环境变量,在那里你可以设置 GIT_COMMITTER_NAMEGIT_COMMITTER_EMAIL,但我不确定你是否能够在重新设置基础期间轻松地逐个设置这些变量。

1
我明白了。这与持续集成自动化有关。详细阐述需要一些时间,但你给我的信息很有帮助。幸运的是,原作者的名字仍然存在。 - solstice333

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接