2012-12-29 4 views
5

Supponiamo di clonare un repository git dal percorso /path/to/repo. Il repository originale sarà un remoto chiamato "origine". Posso recuperare oggetti dall'origine con il comando git fetch origin. Ciò recupererà tutti gli oggetti dalla "origine" remota, inclusi eventuali rami creati.Git: Qual è la differenza tra il recupero da remoto con nome e il recupero da un URL?

Ciò che è curioso è che se prelevo esplicitamente da quello stesso repository con il comando git fetch /path/to/repo, mi sembra di recuperare tutti gli oggetti commit ma non nessuno dei rami.

Perché è quello? Non sto facendo esattamente la stessa cosa in entrambi i casi? Come può il comportamento di Git essere così diverso?

+0

Soltanto solito ** ** tira da un URL, anziché * * recupero dall'URL. –

risposta

5

Chiamato utilizzare a distanza la loro configurazione in cui impostare un refspec schema quando il telecomando è inverosimile:

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

Quindi, questi due formati sono equivalenti:

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

In sostanza: git fetch <path> <source>:<destination>. E la destinazione è importante qui perché è dove sono memorizzati i puntatori HEAD e rami remoti.

Effettuando git fetch /path/to/repo, non si imposta alcun refspec. In questo modo, recupera solo i commit, non gli oggetti perché git non è stato istruito per riceverli e memorizzarli.

Ci possono essere alcuni dettagli o convenzioni di denominazione non corretti qui, sentitevi liberi di modificare. Ma l'idea globale dovrebbe essere corretto

+0

Nota: non imposta rami di localizzazione remota, ma imposta 'FETCH_HEAD'. Solo FYI. –

2

La differenza principale è che il recupero da un URL non memorizza lo stato di filiali in repository remoto in filiali remote-tracking (per esempio refs/heads/master cioè master filiale in remoto origin in refs/remotes/origin/master aka origin/master) ma solo in FETCH_HEAD.

Utilizzando URL invece di impostare a distanza via git remote add viene utilizzato in una tantumtira cioè:

$ git pull <URL> <branch or tag>