Git:从命名远程获取和从URL获取之间的区别是什么?

Joc*_*omo 5 git fetch

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

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

这是为什么?在这两种情况下我都没有做同样的事情吗?Git的行为如何如此不同?

Sim*_*ias 5

命名远程使用其配置,在refspec获取此远程时设置架构:

[remote "origin"]
    fetch = +refs/heads/*:refs/remotes/origin/*
    url   = /path/to/repo
Run Code Online (Sandbox Code Playgroud)

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

git fetch origin
git fetch /path/to/repo +refs/heads/*:refs/remotes/origin/*
Run Code Online (Sandbox Code Playgroud)

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

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

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