2012-12-29 44 views
5

假设我从路径/path/to/repo克隆了一个git仓库。原始存储库将是一个称为“原点”的远程。我可以使用命令git fetch origin从原点获取对象。这将从远程“起源”中检索所有对象,包括所有制作的分支。Git:从指定远程获取和从URL获取有什么区别?

有什么好奇的是,如果我使用命令git fetch /path/to/repo从同一个存储库中显式获取,我似乎检索所有提交对象,但不是任何分支。

这是为什么?在这两种情况下,我没有做过完全一样的事情吗? Git的行为如何不同?

+0

一个通常** **拉动从URL,而不是取* *来自URL。 –

回答

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未被指示获取并存储它们。

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

+0

注意:它没有设置远程跟踪分支,但它确实设置了'FETCH_HEAD'。只是FYI。 –

2

的主要区别是,从一个URL获取不存储在远程存储库分支到远程跟踪分支的状态(例如refs/heads/mastermaster分公司在远程originrefs/remotes/origin/master又名origin/master)但仅限于FETCH_HEAD

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

$ git pull <URL> <branch or tag> 
相关问题