我的行为非常奇怪。我有一个在Bamboo上运行的bash脚本,它设置了所需的git用户,提交了一些更改,然后将它们推送到主分支。
问题在于,提交是由正确的用户完成的,但推送是由不同的用户完成的。
提交看起来像:
USERX authored commit 7d365...
然后推动:
USERY pushed to master at user/repo
设置用户名和电子邮件后,提交和推送一个接一个地完成,为什么会发生这种情况,我应该寻找什么?这是我的bash脚本的一部分:
git config user.name "$bamboo_GIT_USER_NAME"
git config user.email "$bamboo_GIT_USER_EMAIL"
git add -v CHANGELOG.rst || exit 3
git commit -v -m "Updated CHANGELOG.rst" || exit 3
git push origin "$bamboo_GIT_BRANCH" -v || exit 3
答案 0 :(得分:4)
提交是存在于git存储库中的实际事物(特别是“对象”)。它们包含给作者和提交者的文本字符串。一旦写入对象,这些就是永久性的,不可更改的。
除此之外:git commit --amend
不会改变它们;相反,它在提交中使用不同的数据进行新的不同的提交,并将分支头指向新的提交:
... - E - F - G <-- master
如果你然后git commit --amend --author='someone else <someone@else.where>'
,git放弃旧提示提交(G
),添加新提交(G'
):
... - E - F - G [abandoned]
\
G' <-- master
执行git push
时,这会有很大不同。
比方说,例如,您首先git fetch
来自git://else.where/path/to/repo.git
的存储库中的其他人写的一些提交。或者,您编写自己的提交,并将user.name
和user.email
设置为一些不常见的值。
git add
但没有git commit
。然后你git push
这些提交(由其他人撰写,或通过奇user.name
和user.email
提交)到ssh://mylogin@some.place/different/path/to/repo.git
。
在这里,您打包检索的提交,并将它们提供给您的其他服务器。但是你(具体来说,mylogin
)通过ssh登录some.place
,提交提交;您提交的提交是您从else.where
检索到的永久,不可更改的存储库对象,或者是您在user.name
和user.email
中设置的设置。
请注意,git 不会对您进行身份验证或登录主机some.place
。正如您所知(或者更确切地说,mylogin@some.place
),这是对您进行身份验证并将您登录的ssh。然后你的ssh会话运行git命令,该命令接收你发送的git对象。如果您在some.place
上询问哪些用户正在运行ssh,则会得到mylogin
:那是通过ssh登录的用户。这与存储在正在上载的提交中的作者和提交者名称完全断开。
答案 1 :(得分:0)
应该是这样的。
要更改上次提交的作者:
$ git commit --amend --author='somebody <somebody@example.com>'