git - 在 '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 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
(注释掉的行)- 也许还设置
url
orpushurl
,永久或临时
- 也许还设置
- 跟进
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/config
下remote.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 配置文件中即可工作(尽管和以前一样,这些文件继续以明文形式存储在您的脚本中)。
推荐阅读
- javascript - 在此 PHP 站点中找不到更改超全局变量的位置
- database - 如何将日志从 DB 移动到 oracle 中的其他归档格式
- ios - NSTimer 迭代 4
- python - 单击 selenium python 后从菜单中选择
- node.js - Passport.authenticate 导出-> passport.authenticate(一些东西)(req,res,next)?
- aws-lambda - 如何修复 aws-lambda 中的“连接中止”、OSError(97、“协议不支持的地址系列”?
- google-maps - Google 地方信息评论 - profile_photo_url 字段不起作用
- swift - 如何将天的 int 值转换为其日和月值?
- unity3d - Unity3d NavMeshAgent.isOnNavMesh 在特定功能中变为假
- javascript - 如何正确构建此 MongoDB 排序查询?