我有一个非常奇怪的行为。我有一个在 Bamboo 上运行的 bash 脚本,它设置了所需的 git 用户,提交了一些更改,然后将它们推送到主分支。
问题在于,提交是由正确的用户完成的,但推送是由不同的用户完成的。
提交看起来像:
USERX authored commit 7d365...
然后是推送:
USERY pushed to master at user/repo
commit和push是在设置了username和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
最佳答案
提交是存在于 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 session 然后运行 git 命令来接收您发送的 git 对象。如果你问,在some.place
, 什么用户在运行 ssh, 你得到 mylogin
: 那就是通过 ssh 登录的人。这与存储在正在上传的提交中的作者和提交者姓名完全无关。
关于Git commit 用户不同于 git push 用户,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23151509/