Existe-t-il un moyen de récupérer un seul commit spécifique à partir d'un dépôt Git distant sans le cloner sur mon PC? La structure du dépôt distant est absolument la même que celle du mien et il n'y aura donc aucun conflit, mais je ne sais pas comment faire cela et je ne veux pas cloner cet énorme dépôt.
Je suis nouveau dans git, existe-t-il un moyen
Réponses:
À 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)
Si vous combinez cette configuration côté serveur avec un clone superficiel (
git fetch --depth=1
), vous pouvez demander un seul commit (voirt/t5516-fetch-push.sh
:Vous pouvez utiliser la
git cat-file
commande pour voir que le commit a été récupéré:La documentation complète est:
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)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)D'où la nouvelle documentation :
R .. mentionne dans les commentaires la configuration
uploadpack.allowAnySHA1InWant
, qui permetupload-pack
d'accepter unefetch
requête qui demande n'importe quel objet. (Valeur par défautfalse
).Voir commit f8edeaa (nov. 2016, Git v2.11.1) par David "novalis" Turner (
novalis
) :la source
uploadpack.allowAnySHA1InWant
pas de pénalité de calcul d'accessibilité (et de vecteur DoS).Vous ne clonez qu'une seule fois, donc si vous avez déjà un clone du référentiel distant, en extraire ne téléchargera pas tout à nouveau. Indiquez simplement la branche que vous souhaitez extraire ou récupérez les modifications et récupérez le commit souhaité.
Récupérer à partir d'un nouveau référentiel est très économique en bande passante, car il ne téléchargera que les modifications que vous n'avez pas. Pensez à ce que Git fasse la bonne chose, avec une charge minimale.
Git stocke tout dans un
.git
dossier. Un commit ne peut pas être récupéré et stocké isolément, il a besoin de tous ses ancêtres. Ils sont interdépendants .Pour réduire la taille du téléchargement, vous pouvez cependant demander à git de récupérer uniquement les objets liés à une branche ou un commit spécifique:
Cela téléchargera uniquement les commits contenus dans la branche distante
branch
(et uniquement ceux que vous manquez) et les stockera dansorigin/branch
. Vous pouvez ensuite fusionner ou commander.Vous pouvez également spécifier uniquement un commit SHA1:
Cela téléchargera uniquement le commit du SHA-1 96de5297df870 spécifié (et ses ancêtres que vous manquez) et le stockera en tant que branche distante (non existante)
origin/foo-commit
.la source
2.7.4-0ubuntu1.3
. Cependant, lors de l'utilisation2.16.2-0ppa1~ubuntu16.04.1
depuis le PPA git-core, cela fonctionne comme il se doit. Sonne comme un bug qui a été corrigé. Impossible de trouver une référence à cela avec une recherche rapide. Si quelqu'un peut me donner un indice à ce sujet, j'aimerais que ce correctif soit rétroporté.J'ai fait un tirage sur mon repo git:
Permettre à git de récupérer tout le code de la branche, puis je suis allé faire une réinitialisation du commit qui m'intéressait.
git reset --hard <commit-hash>
J'espère que cela t'aides.
la source
git reset --hard
, lorsqu'elles sont partagées dans des solutions généralisées, peuvent conduire les gens dans des pièges où ils perdent des données (ou, dans ce cas: dans un état où la récupération de leurs données n'est pas triviale).Vous pouvez simplement récupérer un seul commit d'un dépôt distant avec
où,
<repo>
peut être un nom de dépôt distant (par exempleorigin
) ou même une URL de dépôt distant (par exemplehttps://git.foo.com/myrepo.git
)<commit>
peut être le commit SHA1par exemple
après avoir récupéré le commit (et les ancêtres manquants), vous pouvez simplement le récupérer avec
Notez que cela vous amènera à l'état de «tête détachée».
la source
fetch
un rev spécifique comme vous le faites là, git échoue avec le code d'erreur 1 et aucune sortie. Est-ce quelque chose qui fonctionnait dans les versions précédentes? (Je suis v2.0.2.)fetch
, bien que dans ce cas je ne sais pas quelle est l'utilisation.git checkout FETCH_HEAD
aide.--depth=1
)!Vous pouvez simplement récupérer le dépôt distant avec:
où,
<repo>
peut être un nom de dépôt distant (par exempleorigin
) ou même une URL de dépôt distant (par exemplehttps://git.foo.com/myrepo.git
)par exemple:
après avoir récupéré les dépôts, vous pouvez fusionner les commits que vous voulez (puisque la question concerne la récupération d'un commit, à la place, vous pouvez utiliser cherry-pick pour choisir un seul commit):
<commit>
peut être le commit SHA1par exemple:
ou
s'il s'agit du dernier commit que vous souhaitez fusionner, vous pouvez également utiliser la variable FETCH_HEAD:
la source
git config set uploadpack.allowReachableSHA1InWant
?Cela fonctionne mieux:
nom "temp" comme vous voulez ... cette branche est peut-être orpheline
la source
Enfin, j'ai trouvé un moyen de cloner un commit spécifique en utilisant git cherry-pick . En supposant que vous n'avez pas de référentiel en local et que vous extrayez un commit spécifique à distance,
1) créer un référentiel vide dans local et git init
2) git remote add origin " url-of-repository "
3) git fetch origin [cela ne déplacera pas vos fichiers vers votre espace de travail local à moins que vous ne les fusionniez]
4) git cherry-pick " Entrez-long-commit-hash-that-you-need "
De cette façon, vous n'aurez que les fichiers de ce commit spécifique dans votre fichier local.
Entrez-long-commit-hash:
Vous pouvez l'obtenir en utilisant -> git log --pretty = oneline
la source
Je pense que 'git ls-remote' ( http://git-scm.com/docs/git-ls-remote ) devrait faire ce que vous voulez. Sans force pour aller chercher ou tirer.
la source
Si le commit demandé se trouve dans les pull requests du référentiel distant, vous pouvez l'obtenir par son ID:
la source