我得到一个非常奇怪的行为。我有一个在Bamboo上运行的bash脚本,该脚本设置所需的git用户,提交一些更改,然后将其推送到master分支。
问题是,提交是由正确的用户完成的,而推送是由其他用户完成的。
提交看起来像:
USERX authored commit 7d365...
Run Code Online (Sandbox Code Playgroud)
然后推送:
USERY pushed to master at user/repo
Run Code Online (Sandbox Code Playgroud)
设置用户名和电子邮件后,提交和推送会一个接一个地完成,为什么会发生这种情况,我应该寻找什么?这是我的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
Run Code Online (Sandbox Code Playgroud)
提交是git存储库中的实际内容(特别是“对象”)。它们包含给作者和提交者的文本字符串。一旦写入对象,它们将是永久的且不可更改。
撇开:git commit --amend不改变它们;相反,它将进行一个新的不同的提交,并在提交中使用不同的数据,并将分支头指向新的提交:
... - E - F - G <-- master
Run Code Online (Sandbox Code Playgroud)
如果这样git commit --amend --author='someone else <someone@else.where>',git放弃旧的提示commit(G),添加一个新的commit(G'):
... - E - F - G [abandoned]
\
G' <-- master
Run Code Online (Sandbox Code Playgroud)当您执行时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登录的。这与上载的提交中存储的作者和提交者名称完全断开。