Git commit 用户与 git push 用户不同
Posted
技术标签:
【中文标题】Git commit 用户与 git push 用户不同【英文标题】:Git commit user is different than git push user 【发布时间】:2014-04-18 09:44:02 【问题描述】:我有一个非常奇怪的行为。我有一个在 Bamboo 上运行的 bash 脚本,它设置所需的 git 用户,提交一些更改,然后将它们推送到主分支。
问题是,提交是由正确的用户完成的,但推送是由不同的用户完成的。
提交看起来像:
USERX authored commit 7d365...
然后是推:
USERY pushed to master at user/repo
commit和push都是在设置好用户名和email后依次完成的,为什么会出现这种情况,我该找什么?这是我的 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
【问题讨论】:
【参考方案1】:提交是存在于 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
。是 ssh 以您的身份(或者更确切地说,mylogin@some.place
)对您进行身份验证并让您登录。然后,您的 ssh 会话运行接收您发送的 git 对象的 git 命令。如果您在some.place
上询问正在运行 ssh 的用户,您会得到mylogin
:那是通过 ssh 登录的用户。这与存储在正在上传的提交中的作者和提交者名称完全断开。
【讨论】:
我已经更正了我的问题,忘记添加commit
命令。好的,那么在这种情况下我应该怎么做才能防止使用不同的用户名推送?
Git 在推送中没有用户名,因为 git 不在乎。其他事情——例如 ssh,或者记录正在调用它们的用户的程序——才是最重要的。你需要找出如何让那些other程序相信你是一个你不是的人。当然,这会带来各种安全隐患:如何阻止 Internet 上的某个随机人冒充您?然而,许多 shell 脚本中最简单的事情是在环境中覆盖 $USER
(这必须在 git 之外完成——同样,git 本身并不关心,也不会这样做)。
好的。如果这些命令是由 Bamboo 运行的,我如何检查/我应该在哪里查看执行命令的用户,从而被认为是推送提交的用户?
我从未使用过 Bamboo,对其内部结构一无所知,因此无法真正提供帮助。
好的。感谢您为我指明正确的方向,我将进一步调查如何解决 Bamboo 问题。【参考方案2】:
应该是这样的。
要更改最后一次提交的作者:
$ git commit --amend --author='somebody <somebody@example.com>'
【讨论】:
不应该是这样的,这是为什么呢?我设置了用户名和电子邮件,并希望该用户执行提交和推送,为什么会改变?以上是关于Git commit 用户与 git push 用户不同的主要内容,如果未能解决你的问题,请参考以下文章