Git:从命名远程获取和从 URL 获取有什么区别?



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

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

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

命名远程使用他们的配置,当获取该远程时设置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没有被指示获取和存储它们。

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

主要区别在于从URL获取不会将远程存储库中的分支状态存储到远程跟踪分支中(例如refs/heads/mastermaster分支在远程origin中存储到refs/remotes/origin/masterorigin/master),而只存储在 FETCH_HEAD 中。

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

$ git pull <URL> <branch or tag>

相关内容

  • 没有找到相关文章

最新更新