git fetch origin和git fetch ssh:// originurl之间的区别

时间:2017-03-25 08:37:28

标签: git

当我列出我的遥控器时,我得到:

> git remote -vv
origin  ssh://remote:1234/project (fetch)
origin  ssh://remote:1234/project (push)

如果我直接放置原始网址,则远程跟踪分支不会更新。

 > git fetch ssh://remote:1234/project 
   From ssh://remote:1234/project 
   * branch            HEAD       -> FETCH_HEAD

但是,如果我指定" origin",则会更新远程跟踪分支。如果我直接输入上面的原始网址,为什么不更新呢?

> git fetch origin
remote: Counting objects: 19, done
remote: Finding sources: 100% (12/12)
remote: Total 12 (delta 2), reused 12 (delta 2)
Unpacking objects: 100% (12/12), done.
From ssh://remote:1234/project 
   1dd995c..32a2ef5  branchA/somename -> origin/branchA/somename 
 * [new branch]      branchB/somename -> origin/branchB/somename 

3 个答案:

答案 0 :(得分:2)

  

如果我直接放置原始网址,远程跟踪分支机构不会更新......

原因很简单:Git很愚蠢。 : - )

更严重的是,使用一个命令,你要对Git说:使用名称Fred或Remote1234,或者等待,我知道,这是最好的名字:origin无论如何,正如我所说,使用该名称,获取一些东西,然后记住它。

使用另一个命令,您说:转到此URL,获取一些内容,并为我记住它。

在什么名称下,Git会记住这些事情吗?

当你说“使用名称origin”时,Git有一个非常好用的名字。它会在每个名称前加上origin/

   1dd995c..32a2ef5  branchA/somename -> origin/branchA/somename 
 * [new branch]      branchB/somename -> origin/branchB/somename 

当你给Git一个简单的URL时,它没有好名字,所以它回溯到几十年前使用的方法,在“遥控器”被发明之前:它将所有信息推送到一个名为{{1的文件中}}。这就是为什么它说:

.git/FETCH_HEAD

(如果你愿意的话,你可以在这里停下来。对于简单的答案,下面的部分不是必需的。其余的更多是关于 Git如何实现这个,而不是一般的想法knock-on effects,那么 部分有一堆little turney knobs

这是一个很好的,令人难忘的解释,但它隐藏了更深层的真相

您的问题暴露出一个重要但有些模糊的区别。您已经在上面显示了它,我引用了它:使用 * branch HEAD -> FETCH_HEAD 更新两个远程跟踪分支进行获取,但使用原始URL进行获取更新或仅创建一个<{1}}文件中的条目。

其原因隐藏在the git fetch documentation,在“受限制的远程跟踪分支”部分下:

origin
     

运行FETCH_HEAD时未指定分支和/或标记    在命令行上获取,例如[remote "origin"] fetch = +refs/heads/*:refs/remotes/origin/* git fetch,    git fetch origin值用作refspecs-they    指定要获取的引用和要更新的本地引用。该    上面的示例将获取原点中存在的所有分支    (即任何与值的左侧匹配的引用,    git fetch)并更新相应的远程跟踪分支    在remote.<repository>.fetch层次结构中。

也就是说,你的Git使用refs/heads/*确定要获取的名称(以及哪些提交以从其他Git获取),您可以显示通过运行:

refs/remotes/origin/*

(我们需要remote.origin.fetch,因为可能有多个这样的配置行;我们想要所有这些,而不仅仅是最后一个,普通git config --get-all remote.origin.fetch 会向我们展示)。因此,给Git命名为--get-all--get,或者更常见的是Fred,告诉Git 默认提取什么,以及如何重命名结果(即在前面粘贴remote1234)。更改origin行或添加其他行会更改默认的“获取内容”和/或“如何重命名结果”。

如果您在命令行上提供refspecs(例如分支名称),则它们不太相关,但不完全与 ir 相关:

origin/
例如

。在这里,您明确告诉Git 要获取的内容,覆盖remote.origin.fetch。但是如果你不告诉Git要获取什么,它会查找named-remote的git fetch origin foobranch 'refs/notes/*:refs/notes/origin/*' 设置 - 如果你使用原始URL而不是像remote.origin.fetch这样的远程名称,那么就没有地方可以看,所以你得到另一个历史备份:它只是带来了在其他Git remote.origin.fetch下发现的任何内容。

(文档中有更多内容,例如origin的描述。研究它以获得额外无用的奥术Git知识。:-))

答案 1 :(得分:1)

获取提交,更新FETCH_HEAD(它所获取的所有内容的列表),并另外更新您指定的任何本地引用。当您获取遥控器时,它会在配置中查找网址和引用。

您的裸网址提取没有指定任何要更新的引用,因此它只更新了FETCH_HEAD

您可以使用“refspec”指定要获取和/或更新的引用,并且每个远程都有一个配置的默认refspec与网址一起使用,通常为+refs/heads/*:refs/remotes/remote/*

我有git config --get-regexp的别名,提供默认通配符git config --global alias.gr '!f() { git config --get-regexp "${@-.}"; }; f'(另一个,grl,添加--local开关),你可以

git gr origin

查看任何“起源”相关的配置。

答案 2 :(得分:0)

简短的回答,git fetch url应该可以工作。如果不是这些值得检查。

Sidenote :SSH无法使用HTTP / HTTPS代理。

以下是关于git fetch的详细解答:

  • git fetch,它从reposistery中获取远程跟踪分支,它获取所有最新分支。

  • git fetch可以从单个命名的存储库或URL中获取,也可以一次从多个存储库中获取,如果有,则有一个遥控器。配置文件中的条目。

  • 如果未指定远程,则默认情况下将使用原始远程,除非为当前分支配置了上游分支。

  • 它从远程refs / heads / namespace复制所有分支,并将它们存储到本地refs / remotes / origin / namespace,除非分支..

查看远程分支,无需在本地存储库中配置远程:

$ git fetch git://git.kernel.org/pub/scm/git/git.git maint
$ git log FETCH_HEAD

Please do check the usage of GIT URLS:

可以使用以下语法:

ssh://[user@]host.xz[:port]/path/to/repo.git/

ssh://username@url.com/username/workfolder

在您的情况下,您可以检查配置文件:

也许值得查看remote.origin.fetch设置,如果正确,请尝试使用用户名的ssh网址。

$ git config --get remote.origin.fetch
+refs/heads/master:refs/remotes/origin/master