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 &lt;someone@else.where&gt;',git 放弃旧的提示提交(G),添加一个新的提交(G'):

... - E - F - G   [abandoned]
            \
              G'  <-- master

当您执行git push 时,它会做一些非常不同的事情。

假设,例如,您首先 git fetch 一些其他人编写的提交,来自 git://else.where/path/to/repo.git 的存储库。或者,您编写自己的提交并将 user.nameuser.email 设置为一些不寻常的值。

除此之外:您的示例代码有一个git add,但没有git commit

然后您将git push 这些提交(由其他人编写,或以奇怪的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 命令。好的,那么在这种情况下我应该怎么做才能防止使用不同的用户名推送? 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 用户不同的主要内容,如果未能解决你的问题,请参考以下文章

git pull之前要先commit

git基础教程回退还没push的commit--git reset

git commit/push后如何回退

Git常用操作

Git:添加vs push vs commit

原git如何撤销commit(未push)