【问题标题】:Git fetch not pulling changes when using URL使用 URL 时 Git fetch 不提取更改
【发布时间】:2020-06-02 21:35:03
【问题描述】:

我正在尝试设置一个服务,该服务将在检测到远程分支上的更改时自动更新我的存储库。在任何人提到它之前,我知道在 URL 中嵌入密码是不好的做法。我目前正在使用:

git fetch https://<user>:<pass>@github.com/<org>/<repo>

输出如下:

From https://github.com/<org>/<repo>
 * branch            development -> FETCH_HEAD

当我在提取后运行git status 时,它没有检测到最近的更改。

如果我运行没有 URL 的普通 git fetch 并手动提供用户名和密码,我会得到不同的输出:

From https://github.com/<org>/<repo>
   96353f7..e88782c  development -> origin/development

然后运行git status 会按预期工作并检测到远程分支上有更改。

我对 Git 不是很有经验,我觉得我遗漏了一些非常明显的东西。我的错误在哪里?

编辑

所以看起来缺少的部分是我在 URL 之后指定本地和远程分支:

git fetch https://<user>:<pass>@github.com/<org>/<repo> development:origin/development

正如接受的答案指出的那样:如果您不指定远程名称,git 会将远程更改放在默认的 FETCH_HEAD 中。这可以通过明确指定本地和远程分支来解决。

我仍然有点困惑为什么git fetch 知道默认从源远程获取,但是指定 URL 会改变这个默认值。但无论如何它现在都在工作

【问题讨论】:

  • 是的,显而易见的是,第一个命令会更新索引,但不会触及您的分支。看看我如何使用它:# Sync up with the remotes, prune them, and update the local master branch\n echo "Update Remotes"\n git fetch --all --prune\n git fetch $(git config branch.master.remote) master:master\n。在您的情况下,master 将替换为 development
  • 你说“运行普通的 git fetch”是什么意思?你的意思是git fetch origin
  • 是的,对不起,这就是我的意思。我只是运行git fetch,但我认为默认情况下会获取源远程

标签: git git-fetch git-status remote-repository


【解决方案1】:

Git 远程是与 URL 关联的名称。默认名称是origin,并且 URL 通常是您克隆的任何内容。

Git 将远程存储库的快照存储在“远程跟踪分支”中。这些格式为&lt;remote-name&gt;/&lt;branch&gt;。当你 git fetch origin Git 会从与 origin 关联的 URL 中获取更改并将它们放入远程分支。 development -&gt; origin/development 告诉你它把远程的开发分支放到你的origin/development 远程分支中。

当您运行 git fetch https://&lt;user&gt;:&lt;pass&gt;@github.com/&lt;org&gt;/&lt;repo&gt; 并只给它 URL,没有远程名称时,Git 没有远程跟踪分支的名称。所以它只是将它们粘在一个短暂的FETCH_HEAD 中,它记录了你最后的git fetch。这就是development -&gt; FETCH_HEAD 告诉你的。


无论如何,git status 不会显示任何变化。 git fetch 永远不会更改您的本地分支机构、索引或结帐。它只会更新您的远程跟踪分支。这样可以安全地习惯性地运行 git fetch 来更新远程存储库的快照。

您要更新远程分支的本地副本是git pull


最后,为了避免每次都输入您的用户名和密码,或者更糟糕的是,将它们硬编码到 URL 中,set up a Git credential helper to securely store your username and password

【讨论】:

  • 我仍然对为什么它与 URL 的工作方式不同感到困惑。在您的回答中,您说git fetch origin 从与origin 关联的URL 中获取更改。那么不应该以相同的方式指定 URL 而不是远程名称吗?我没有尝试将更改应用到本地分支(还),我只是尝试使用 git status 来查看分支是否是最新的。如何使用 URL 格式指定远程名称?我尝试了git fetch &lt;url&gt; origingit fetch &lt;url&gt;\origingit fetch &lt;url&gt; origin\development 和其他一些格式,但没有成功
  • 没关系,我弄清楚了语法,我会更新我的问题。感谢您为我指明正确的方向!
  • @user2437443 "那么指定 URL 而不是远程名称不应该以同样的方式工作吗?" 也许,但无论出于何种原因,它都没有。如果我不得不猜测原因,设计人员认为,如果您手动指定一个 URL,那么您已经有一个遥控器,您可能不希望遥控器的分支发生变化。这就引出了一个问题:如果您已经有一个具有相同 URL 的命名远程,那么您为什么要使用该 URL?最后,git fetch 不会改变你的本地分支或工作树,也不应该影响git status
猜你喜欢
  • 1970-01-01
  • 2018-04-15
  • 2017-01-15
  • 2020-12-18
  • 2017-11-26
  • 1970-01-01
  • 2015-07-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多