À partir de Git version 2.5+ (Q2 2015), récupérer un seul commit (sans cloner le dépôt complet) est en fait possible.
Voir commit 68ee628 par Fredrik Medley ( moroten
) , 21 mai 2015
(fusionné par Junio C Hamano - gitster
- dans commit a9d3493 , 01 juin 2015)
Vous avez maintenant une nouvelle configuration (côté serveur)
uploadpack.allowReachableSHA1InWant
Autorise upload-pack
à accepter une demande de récupération qui demande un objet accessible depuis n'importe quel conseil de référence. Cependant, notez que le calcul de l'accessibilité des objets est coûteux en calcul.
La valeur par défaut est false
.
Si vous combinez cette configuration côté serveur avec un clone superficiel ( git fetch --depth=1
), vous pouvez demander un seul commit (voir t/t5516-fetch-push.sh
:
git fetch --depth=1 ../testrepo/.git $SHA1
Vous pouvez utiliser la git cat-file
commande pour voir que le commit a été récupéré:
git cat-file commit $SHA1
" git upload-pack
" qui sert " git fetch
" peut être dit de servir des commits qui ne sont à la pointe d'aucune référence, tant qu'ils sont accessibles depuis une référence, avec uploadpack.allowReachableSHA1InWant
une variable de configuration.
La documentation complète est:
upload-pack
: autorise éventuellement la récupération de sha1 accessible
Avec l' uploadpack.allowReachableSHA1InWant
option de configuration définie côté serveur, " git fetch
" peut faire une requête avec une ligne "want" qui nomme un objet qui n'a pas été annoncé (susceptible d'avoir été obtenu hors bande ou à partir d'un pointeur de sous-module).
Seuls les objets accessibles depuis les extrémités des branches, c'est-à-dire l'union des branches annoncées et des branches masquées par transfer.hideRefs
, seront traités.
Notez qu'il y a un coût associé à devoir revenir en arrière dans l'historique pour vérifier l'accessibilité.
Cette fonctionnalité peut être utilisée lors de l'obtention du contenu d'un certain commit, pour lequel le sha1 est connu, sans avoir besoin de cloner tout le référentiel, surtout si une extraction superficielle est utilisée .
Les cas utiles sont par exemple
- référentiels contenant des fichiers volumineux dans l'historique,
- récupérer uniquement les données nécessaires pour une extraction de sous-module,
- lors du partage d'un sha1 sans dire à quelle branche exacte il appartient et dans Gerrit, si vous pensez en termes de commits au lieu de changements de nombres.
(Le cas Gerrit a déjà été résolu allowTipSHA1InWant
car chaque changement de Gerrit a une référence.)
Git 2.6 (Q3 2015) améliorera ce modèle.
Voir commit 2bc31d1 , commit cc118a6 (28 juillet 2015) par Jeff King ( peff
) .
(Fusionné par Junio C Hamano - gitster
- in commit 824a0be , 19 août 2015)
refs
: support négatif transfer.hideRefs
Si vous masquez une hiérarchie de références à l'aide de la transfer.hideRefs
configuration, il n'y a aucun moyen de surcharger ultérieurement cette configuration pour la "montrer".
Ce patch implémente un masquage "négatif" qui fait que les correspondances sont immédiatement marquées comme non masquées, même si une autre correspondance la masquerait.
Nous prenons soin d'appliquer les correspondances dans l'ordre inverse de la façon dont elles nous sont fournies par la machine de configuration, car cela permet à notre habituelle priorité de configuration "le dernier gagne" (et les entrées dans .git/config
, par exemple, seront remplacées /etc/gitconfig
).
Vous pouvez donc maintenant faire:
git config --system transfer.hideRefs refs/secret
git config transfer.hideRefs '!refs/secret/not-so-secret'
pour se cacher refs/secret
dans tous les dépôts, à l'exception d'un bit public dans un dépôt spécifique.
Git 2.7 (novembre / décembre 2015) s'améliorera à nouveau:
Voir commit 948bfa2 , commit 00b293e (05 novembre 2015), commit 78a766a , commit 92cab49 , commit 92cab49 , commit 92cab49 (03 nov 2015), commit 00b293e , commit 00b293e (05 nov 2015) et commit 92cab49 , commit 92cab49 , commit 92cab49 , commit 92cab49 (03 novembre 2015) par Lukas Fleischer ( lfos
) .
Aide: Eric Sunshine ( sunshineco
) .
(Fusionné par Jeff King - peff
- dans commit dbba85e , 20 novembre 2015)
config.txt
: documenter la sémantique de hideRefs
with namespaces
À l'heure actuelle, il n'y a pas de définition claire du transfer.hideRefs
comportement à adopter lorsqu'un espace de noms est défini.
Expliquez que les hideRefs
préfixes correspondent aux noms supprimés dans ce cas. C'est ainsi que les hideRefs
modèles sont actuellement traités dans receive-pack.
hideRefs: ajout de la prise en charge de la correspondance des références complètes
En plus de faire correspondre les références dépouillées, on peut maintenant ajouter des hideRefs
modèles avec lesquels la référence complète (non rayée) est comparée.
Pour faire la distinction entre les correspondances dénudées et complètes, ces nouveaux modèles doivent être précédés d'un circumflex ( ^
).
D'où la nouvelle documentation :
transfer.hideRefs:
Si un espace de noms est en cours d'utilisation, le préfixe d'espace de noms est supprimé de chaque référence avant d'être mis en correspondance avec les transfer.hiderefs
modèles.
Par exemple, si refs/heads/master
est spécifié dans transfer.hideRefs
et que l'espace de noms actuel l'est foo
, alors refs/namespaces/foo/refs/heads/master
est omis des publicités mais refs/heads/master
et
refs/namespaces/bar/refs/heads/master
est toujours annoncé comme des lignes dites "ont".
Afin de faire correspondre les références avant le décapage, ajoutez un ^
devant le nom de la référence. Si vous combinez !
et ^
, !
doit être spécifié en premier.
R .. mentionne dans les commentaires la configuration uploadpack.allowAnySHA1InWant
, qui permet upload-pack
d'accepter une fetch
requête qui demande n'importe quel objet. (Valeur par défaut false
).
Voir commit f8edeaa (nov. 2016, Git v2.11.1) par David "novalis" Turner ( novalis
) :
upload-pack
: autorise éventuellement la récupération de tout sha1
Il semble un peu idiot de faire un contrôle d'accessibilité dans le cas où nous faisons confiance à l'utilisateur pour accéder à absolument tout dans le référentiel.
En outre, c'est racé dans un système distribué - peut-être qu'un serveur annonce une référence, mais un autre a depuis eu une poussée forcée vers cette référence, et peut-être que les deux requêtes HTTP finissent par être dirigées vers ces différents serveurs.