5

假设我从路径克隆了一个 git 存储库/path/to/repo。原始存储库将是一个名为“origin”的远程存储库。我可以使用命令从原点获取对象git fetch origin。这将从远程“原点”检索所有对象,包括所做的任何分支。

奇怪的是,如果我使用 command 从同一个存储库中显式获取git fetch /path/to/repo,我似乎检索到了所有提交对象,但没有检索到任何分支。

这是为什么?在这两种情况下,我做的事情不是完全相同吗?Git 的行为怎么会如此不同?

4

2 回答 2

5

命名远程使用他们的配置,他们refspec在获取此远程时设置模式:

[remote "origin"]
    fetch = +refs/heads/*:refs/remotes/origin/*
    url   = /path/to/repo

所以,这两种格式是等价的:

git fetch origin
git fetch /path/to/repo +refs/heads/*:refs/remotes/origin/*

基本上:git fetch <path> <source>:<destination>。目的地在这里很重要,因为它是存储远程 HEAD 和分支指针的地方。

通过这样做git fetch /path/to/repo,您不会设置任何 refspec。因此,它只获取提交,而不是对象,因为git没有被指示获取和存储它们。

这里可能有一些细节或命名约定不正确,请随时编辑。但全球的想法应该是正确的

于 2012-12-29T21:47:15.030 回答
2

主要区别在于,从 URL 获取不会将远程存储库中分支的状态存储到远程跟踪分支(例如,远程分支到refs/heads/masteraka中) ,而仅存储在.masteroriginrefs/remotes/origin/masterorigin/masterFETCH_HEAD

一次性使用使用URL而不是设置远程通过git remote add,即:

$ git pull <URL> <branch or tag>
于 2012-12-30T12:45:55.840 回答