Git提交的用户与Git推送的用户不同

4

我遇到了一个非常奇怪的行为。 我有一个在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
2个回答

6

提交记录是实际存在于git仓库中的“对象”。它们包含文本字符串,提供作者和提交者信息。一旦写入对象,这些信息就是永久不可更改的。

  • Aside: git commit --amend does not change them; instead, it makes a new, different commit, with different data in the commit, and points the branch-head to the new commit:

    ... - E - F - G   <-- master
    

    If you then git commit --amend --author='someone else <someone@else.where>', git abandons the old tip commit (G), adding a new commit (G'):

    ... - E - F - G   [abandoned]
                \
                  G'  <-- master
    
当你执行git push时,这会执行非常不同的操作。
例如,你首先从git://else.where/path/to/repo.git的存储库中使用git fetch获取了其他人编写的一些提交,或者使用设置为某些不寻常值的user.nameuser.email编写了自己的提交。
此后,你将这些提交(由他人编写或使用奇怪的user.nameuser.email进行提交)推送到ssh://mylogin@some.place/different/path/to/repo.git
在这里,你打包检索到的提交并将它们传递到另一个服务器。但是,是你(特别是mylogin)通过ssh登录到some.place,传递提交;你传递的提交是从else.where检索到的永久且无法更改的存储库对象,或者是使用user.nameuser.email设置下创建的对象。
请注意,git不会对你进行身份验证或登录到主机some.place。ssh对你进行身份验证并登录,作为你(或者更确切地说,mylogin@some.place)。然后,你的ssh会话运行接收你发送的git对象的git命令。如果你在some.place上询问正在运行ssh的用户,你会得到mylogin:这是通过ssh登录的人。这与上传的提交中存储的作者和提交者名称完全无关。

我已经更正了我的问题,忘记添加commit命令。那么,在这种情况下,我应该怎么做才能防止使用不同的用户名进行推送? - linkyndy
1
Git 在推送时没有用户名,因为 Git 不关心。其他的事情——例如 ssh 或者记录调用它们的用户的程序——才关心这个。你需要找出如何让那些“其他”程序相信你是一个你本来不是的人。当然,这涉及到各种安全问题:有什么办法可以防止互联网上的某个陌生人冒充你呢?然而,在许多 shell 脚本中最简单的事情就是在环境中覆盖 $USER(必须在 Git 之外完成——再次强调,Git 本身并不关心,也不会这样做)。 - torek
好的。如果这些命令是由Bamboo运行的,我该如何检查/在哪里查看以查看执行命令的用户,并因此被视为推送提交的用户? - linkyndy
我从来没有使用过Bamboo,对它的内部结构一无所知,所以无法提供帮助。 - torek
好的。谢谢你指引我正确的方向,我会进一步调查如何解决Bamboo问题。 - linkyndy

0

应该是这样的。

要更改最后一次提交的作者:

$ git commit --amend --author='somebody <somebody@example.com>'

不应该是这样的,为什么会这样呢?我设置了用户名和电子邮件,并期望该用户执行提交和推送,为什么会改变呢? - linkyndy

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