当我列出我的遥控器时,我得到:
> 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
答案 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如何实现这个,而不是一般的想法如果你开始摆弄所有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