A partire da Git versione 2.5+ (Q2 2015), è effettivamente possibile recuperare un singolo commit (senza clonare l'intero repository).
Vedi commit 68ee628 di Fredrik Medley ( moroten
) , 21 maggio 2015.
(Fusione di Junio C Hamano - gitster
- in commit a9d3493 , 01 giu 2015)
Ora hai una nuova configurazione (sul lato server)
uploadpack.allowReachableSHA1InWant
Consentire upload-pack
di accettare una richiesta di recupero che richiede un oggetto raggiungibile da qualsiasi suggerimento di riferimento. Tuttavia, si noti che il calcolo della raggiungibilità degli oggetti è costoso dal punto di vista computazionale.
L'impostazione predefinita è false
.
Se si combina quella configurazione lato server con un clone superficiale ( git fetch --depth=1
), è possibile richiedere un singolo commit (consultare t/t5516-fetch-push.sh
:
git fetch --depth=1 ../testrepo/.git $SHA1
Puoi usare il git cat-file
comando per vedere che il commit è stato recuperato:
git cat-file commit $SHA1
" git upload-pack
" che serve " git fetch
" può essere detto di servire i commit che non sono sulla punta di alcun riferimento, purché siano raggiungibili da un riferimento, con uploadpack.allowReachableSHA1InWant
variabile di configurazione.
La documentazione completa è:
upload-pack
: facoltativamente consenti il recupero di sha1 raggiungibile
Con l' uploadpack.allowReachableSHA1InWant
opzione di configurazione impostata sul lato server, " git fetch
" può effettuare una richiesta con una riga "want" che denomina un oggetto che non è stato pubblicizzato (probabilmente è stato ottenuto fuori banda o da un puntatore sottomodulo). Verranno elaborati
solo gli oggetti raggiungibili dalle punte dei rami, ovvero l'unione dei rami pubblicizzati e dei rami nascosti da transfer.hideRefs
.
Si noti che esiste un costo associato di dover tornare indietro nella cronologia per verificare la raggiungibilità.
Questa funzione può essere utilizzata quando si ottiene il contenuto di un determinato commit, per il quale è noto sha1, senza la necessità di clonare l'intero repository, specialmente se viene utilizzato un recupero superficiale .
Casi utili sono ad es
- repository contenenti file di grandi dimensioni nella cronologia,
- recuperare solo i dati necessari per un checkout del sottomodulo,
- quando condividi uno sha1 senza dire a quale ramo esatto appartiene e in Gerrit, se pensi in termini di commit invece di cambiare i numeri.
(Il caso Gerrit è già stato risolto allowTipSHA1InWant
poiché ogni modifica di Gerrit ha un riferimento.)
Git 2.6 (Q3 2015) migliorerà quel modello.
Vedi commit 2bc31d1 , commit cc118a6 (28 lug 2015) di Jeff King ( peff
) .
(Unita da Junio C Hamano - gitster
- in commit 824a0be , 19 ago 2015)
refs
: supporto negativo transfer.hideRefs
Se nascondi una gerarchia di ref usando la transfer.hideRefs
configurazione, non c'è modo di sostituire successivamente quella configurazione per "scoprirla".
Questa patch implementa un nascondiglio "negativo" che fa sì che le corrispondenze vengano immediatamente contrassegnate come nascoste, anche se un'altra corrispondenza lo nasconderebbe.
Ci preoccupiamo di applicare le partite in ordine inverso rispetto a come ci vengono fornite dal macchinario di configurazione, in quanto ciò consente al nostro solito lavoro di precedenza di configurazione "ultimo vincitore" (e le voci .git/config
, ad esempio, avranno la precedenza /etc/gitconfig
).
Quindi ora puoi fare:
git config --system transfer.hideRefs refs/secret
git config transfer.hideRefs '!refs/secret/not-so-secret'
per nascondere refs/secret
in tutti i repository, ad eccezione di un bit pubblico in un repository specifico.
Git 2.7 (nov / dic 2015) migliorerà di nuovo:
Vedi commit 948bfa2 , commit 00b293e (05 nov 2015), commit 78a766a , commit 92cab49 , commit 92cab49 , commit 92cab49 (03 nov 2015), commit 00b293e , commit 00b293e (05 nov 2015) e commit 92cab49 , commit 92cab49 , commit 92cab49 , commit 92cab49 (03 nov 2015) di Lukas Fleischer ( lfos
) .
Aiutato da: Eric Sunshine ( sunshineco
) .
(Unito da Jeff King - peff
- in commit dbba85e , 20 nov 2015)
config.txt
: documenta la semantica di hideRefs
con namespace
Al momento, non esiste una definizione chiara di come transfer.hideRefs
dovrebbe comportarsi quando viene impostato uno spazio dei nomi.
Spiega che i hideRefs
prefissi corrispondono ai nomi eliminati in quel caso. Questo è il modo in cui i hideRefs
modelli sono attualmente gestiti nel pacchetto di ricezione.
hideRefs: aggiunge il supporto per la corrispondenza dei riferimenti completi
Oltre ad abbinare i ref stripped, ora è possibile aggiungere dei hideRefs
pattern a cui è confrontato il ref completo (non strippato).
Per distinguere tra corrispondenze spogliate e intere, questi nuovi schemi devono essere preceduti da una circonflessa ( ^
).
Da qui la nuova documentazione :
transfer.hideRefs:
Se viene utilizzato uno spazio dei nomi, il prefisso dello spazio dei nomi viene rimosso da ogni riferimento prima che venga confrontato con i transfer.hiderefs
modelli.
Ad esempio, se refs/heads/master
viene specificato in transfer.hideRefs
e lo spazio dei nomi corrente lo è foo
, refs/namespaces/foo/refs/heads/master
viene omesso dagli annunci pubblicitari refs/heads/master
e
refs/namespaces/bar/refs/heads/master
viene comunque pubblicizzato come le cosiddette righe "have".
Per abbinare i ref prima dello stripping, aggiungi un ^
davanti al nome dell'arbitro. Se si combinano !
e ^
, è !
necessario specificare prima.
R .. menziona nei commenti la configurazione uploadpack.allowAnySHA1InWant
, che consente upload-pack
di accettare una fetch
richiesta che richiede qualsiasi oggetto. (L'impostazione predefinita è false
).
Vedi commit f8edeaa (novembre 2016, Git v2.11.1) di David "novalis" Turner ( novalis
) :
upload-pack
: opzionalmente consentire il recupero di qualsiasi sha1
Sembra un po 'sciocco fare un controllo di raggiungibilità nel caso in cui ci fidiamo che l'utente acceda assolutamente a tutto nel repository.
Inoltre, è audace in un sistema distribuito - forse un server pubblicizza un riferimento, ma da allora un altro ha avuto una spinta forzata verso quel riferimento, e forse le due richieste HTTP finiscono per essere dirette a questi diversi server.