首页 > 解决方案 > 在 'git push origin' 之后,'origin/master' 没有得到更新(使用脚本时)

问题描述

当使用 Bash 脚本(提供用户和密码)执行“git push origin”时,'origin/master'没有更新,并且git status会显示

 "Your branch is ahead of 'origin/origin' by 2 commits.

在没有脚本(没有提供用户和密码)的情况下做同样的事情origin/origin会得到很好的更新。

我将问题缩小到执行推送的方式,出于某种原因,提供带有远程 URL 的用户名和密码会导致问题。

#!/bin/bash

#save current working directory
current_dir=${PWD} 


read -r -p 'git commit message: ' comment  # prompt user for commit message
git add .                                  # track all files
git commit -m "${comment}"                 # commit with message


#git push origin master
git push http://username:password@git.url master

标签: git

解决方案


您的脚本不这样做git push origin,而是git push <url>

#git push origin master
git push http://username:password@git.url master

也就是说,您给出了一个 URL,而不是 name origin。所以如果推送成功,Git 不知道它应该更新你自己的origin/master.

您可以执行以下任何操作:

  • 使用git push origin master(注释掉的行)
    • 也许还设置urlor pushurl,永久或临时
  • 跟进git push基于 URL 的名称git fetch origin
  • 强行更新自己的origin/master

请记住,这origin/master您的Git 设置和更新的名称,以记住他们的Git(最后一个origin)是什么: master

  • 当你运行时git fetch origin,你的 Git 会调用他们的 Git,向他们的 Git 询问他们所有的分支,获取任何新的提交和其他你需要的项目,并更新你的所有origin/*名字。
  • 当您运行时git push origin master,您的 Git 会调用他们的 Git,向他们提供您拥有但他们没有的任何新提交(以及随之而来的其他项目),并要求他们将 master设置为您刚刚推送的最后一个提交。他们要么说好吧,我做到了,要么说不,我拒绝这样做<出于任何原因>。如果他们说他们这样做了,你的 Git 会更新你的origin/master,因为你的 Git 知道他们的 Git 刚刚设置了什么master

但在这种情况下,您的 Git并没有origin. 相反,它在http://username:password@git.url. Git 可能更新了也可能没有更新,但 Git 与它master什么关系origin?据你的 Git 所知,没有。所以你的 Git不会更新你的origin/master.

为了让你的 Git 意识到这些是同一个“其他 Git”,你必须确保git push调用 name 下的另一个 Git origin。如果你不能让它工作(但你可以,见下文),你可以运行git fetch origin让你的 Git 获取更新,或者使用git update-ref(但不要这样做)。

如何永久提供 URL,或仅用于一项push操作

当你运行时:

git push origin master

Git 首先尝试push从以下结果中获取 URL:

git config --get remote.origin.pushurl

如果没有找到任何东西,它会尝试:

git config --get remote.origin.url

(它还提供 的 URL git fetch)。这个必须成功;如果失败,您既不能git fetch也不能git push使用 name origin

现在您的 Git 有了 URL(来自git config --get),您的 Git 继续尝试调用另一个 Git。当然,这可以自行成功或失败。

因此,要永久设置 和 的 URL git fetch git push可以更改remote.origin.url设置。要永久设置 URL(git push仅保留git fetch一个),您可以设置或更改remote.origin.pushurl设置。有多种不同的方法可以做到这一点;针对命令行用户的git remote命令是:

git remote set-url --push origin http://username:password@git.url

例如,将给定的基于用户名和密码的 URL 记录到设置.git/configremote.origin.pushurl。我自己的偏好是在我的编辑器中运行git config --edit并简单地编辑.git/config文件,但您可能更喜欢使用git remote set-url. 请注意,这会将您的密码记录在一个文件中,这是不安全的;但是无论如何您已经在脚本中完成了此操作,因此实际上并没有比以前差多少。

或者,您可以运行:

git -c remote.origin.pushurl=http://username:password@git.url push origin master

在你的脚本中。在该特定 Git 命令的持续时间内设置单个配置项的-c选项。git因此,这无需将用户名和密码存储在 Git 配置文件中即可工作(尽管和以前一样,这些文件继续以明文形式存储在您的脚本中)。


推荐阅读