为什么我不能签出另外两个更改并进行新的更改

Why can't I checkout another two changes and make a new one

我的团队正在使用 Gerrit。

现在,我和两个同事正在做一个项目。

两者都有git push到Gerrit,也就是说在Gerrit上有两个独立的Changes。

现在,我需要获取他们的更改,将它们合并到我的本地项目中,并将新的更改推送到 Gerrit。

假设现有的两个更改是 AB

在我的本地机器上,我执行以下操作:

git checkout master && git pull
git fetch ... refs/changes/xx/xxxxxx/x && git checkout FETCH_HEAD # checkout A from Gerrit
git switch -c br_a
git fetch ... refs/changes/xx/xxxxxx/y && git checkout FETCH_HEAD # checkout B from Gerrit
git switch -c br_b

现在,我有两个本地分支 br_abr_b,其中包含更改 AB

然后我切换到我自己的本地分支,其中包含我自己的更改:git checkout br_c

之后,我执行 git merge br_agit merge br_bAB 的更改合并到我的本地分支 br_c 中。 (我解决了所有的冲突。)

然后我需要将所有这些推送到 Gerrit。

所以我执行git commitgit push origin HEAD:refs/for/master.

但是,我得到了错误。

remote: Resolving deltas: 100% (26/26)
remote: Processing changes: refs: 1, done
remote:
remote: ERROR:  In commit 1111111098b751266c11111222222a33ce0b83
remote: ERROR:  author email address B@xxx.com
remote: ERROR:  does not match your user account.
remote: ERROR:
remote: ERROR:  The following addresses are currently registered:
remote: ERROR:    me@xxx.com
remote: ERROR:
remote: ERROR:  To register an email address, please visit:
remote: ERROR:  http://gerrit.xxxx.yyyy.com/#/settings/contact
remote:
remote:
To http://gerrit.xxxx.yyyy.com/a/xxx_project
 ! [remote rejected]     HEAD -> refs/for/master (invalid author)
error: failed to push some refs to 'http://gerrit.xxxx.yyyy.com/a/xxx_project'

B@xxx.com 是两位同事之一,所以 git merge 似乎将 A and/or B 的一些元数据带入我的本地分支所以我不能推。

我试过 git commit --amend,删除更改 ID and/or 重置作者和电子邮件,但这没有帮助。

Gerrit 有 2 个权限,Forge Author and Forge Committer。当您推送提交以供审核时,Gerrit 会验证作者电子邮件和提交者电子邮件是否与您在 Gerrit 用户名中注册的电子邮件地址相匹配。如果它们不匹配,则拒绝推送。您使用了 git merge 来应用提交。作者和提交者身份行未更改,并且与您的不匹配。所以推送失败。

这里有2个解决方案。一种是让Gerrit管理员给你2个权限,这样你就可以push别人的commit了。另一种是在不保留作者和提交者身份的情况下应用补丁,通过 git merge --squashgit cherry-pick -ngit apply 或手动修改文件。