2010-09-13 5 views
18

Je n'ai pas un code local copie/etc, je veux juste télécharger un seul git spécifique commit je peux voir. Je l'URL pour le dépôt git:commit télécharger un git spécifique à partir d'un référentiel?

git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-2.6.git

et commit hachage:

ee9c5cfad29c8a13199962614b9b16f1c4137ac9 

Comment puis-je télécharger juste ce commettre en utilisant git (je ne veux pas tout repo, juste le patch de validation)? J'ai lu les pages man pour git-pull et git-cherry-pick et tripoté les commandes sans succès.

Clonage la prise en pension est vraiment pas une option parce que certains des dépôts du noyau sont excessivement grand et lent à télécharger (heures).

+0

Avez-vous essayé la navigation [ce repo via le web] (http://git.kernel.org/?p=linux/kernel/git/davem /net-2.6.git;a=commit;h=ee9c5cfad29c8a13199962614b9b16f1c4137ac9)? – bstpierre

+1

Je voudrais le faire à partir de la ligne de commande pour une variété de raisons (vitesse/efficacité et les scripts étant les principaux). – bigredbob

+3

Un commit est essentiellement un diff. Voulez-vous voir le diff ou voir l'arbre? – Daenyth

Répondre

21

Cela semble impossible. Selon un discussion sur kernel.org, le protocole n'autoriserai nommé refs être tiré par les cheveux. Si vous ne souhaitez pas télécharger l'instantané depuis le site Web git, vous devrez cloner le repo entier.

(Vous voudrez peut-être lire les manuels de git-fetch et git-ls-remote.)

1
git show COMMITID 

Mais vous devez cloner le repo. Pas moyen de contourner cela, je pense. Mais vous pouvez faire un clone peu profond en utilisant l'argument --depth. Aussi

, trouvé un bon SO poste qui couvre ce sujet plus en profondeur Browse and display files in a git repo without cloning

11

Dans le cas général, vous pouvez le faire en utilisant le drapeau --remote à git archive, comme ceci:

$ git archive -o repo.tar --remote=<repo url> <commit id> 

Alors dans votre exemple, vous pouvez utiliser:

$ git archive -o repo.tar --remote=git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-2.6.git ee9c5cfad29c8a13199962614b9b16f1c4137ac9 

cela vous donnera l'état de la prise en pension à ce moment. Notez que vous n'obtiendrez pas le repo entier, donc vous ne pouvez pas réellement interagir avec le repo en amont avec ce que vous avez téléchargé.

Toutefois, l'utilisation de git archive à distance doit être activée côté serveur, et elle ne se trouve pas sur le serveur Git du noyau Linux. Vous pouvez cependant en saisir une copie en utilisant une URL du formulaire http://git.kernel.org/?p=<path to repo>;a=snapshot;h=<commit id>;sf=tgz. Donc, pour votre repo, vous pouvez utiliser, disons, wget ou curl pour récupérer le fichier en utilisant cette URL.

+1

Malheureusement, cette méthode n'est pas fiable/scriptable (et certains dépôts git n'ont pas d'interface web facilement trouvée). – bigredbob

+0

C'est vrai, mais dans votre cas, cela fonctionnerait. – mipadi

+1

Cela devrait fonctionner, sauf que le contenu Web est généré à la volée. Les résultats de 'curl http: //git.kernel.org/? P = linux/kernel/git/davem/net-2.6.git; a = instantané; h = ee9c5cfad29c8a13199962614b9b16f1c4137ac9; sf = tgz' sont Génération .. ' – wlangstroth

-1

Dans ce cas, si tout ce que vous voulez est le diff, vous pouvez le télécharger à partir du frontend web pour le repo du noyau à l'adresse suivante:

http://git.kernel.org/?p=linux/kernel/git/davem/net-2.6.git;a=commitdiff_plain;h=ee9c5cfad29c8a13199962614b9b16f1c4137ac9 

Vous pouvez jouer avec l'URL pour obtenir d'autres validations.

2

Je sais que cela fonctionne quand vous avez un clone du repo (ou une prise en pension similaire) ..

git fetch git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-2.6.git 
git cherry-pick ee9c5cfad29c8a13199962614b9b16f1c4137ac9 

Fetch téléchargements les refs à distance (mais pas tout repo, je ne pense pas) si que vous pouvez les référencer avec les autres commandes. Ensuite, vous choisissez ce commit, et il essaie d'appliquer le diff à votre arbre local.

Je ne l'ai pas essayé sans un git repo localement, mais je l'ai essayé sur repos qui ne sont pas des fourchettes l'un de l'autre. vous pouvez avoir des conflits de fusion, mais vous pouvez les nettoyer manuellement.

+0

Cela ne fonctionnera que si le commit que vous choisissez est un ancêtre de la tête du repo. –

+0

Je viens d'essayer ceci --- le 'git fetch' essaye de tout télécharger. –

0

J'avais le même besoin. Je dois télécharger un patch d'un commit spécifique que j'ai besoin d'appliquer sur une autre branche.

J'utilisé: git format-patch sha-id

Il suffit de spécifier le sha-id qui est juste plus que le nécessaire engagement. Il donnera .patch fichiers correspondant à tous les commits.

0

Je me suis heurté à ce problème aujourd'hui, et j'ai trouvé un moyen de télécharger des archives pour un commit spécifique. Si vous allez dans un dépôt sur git.kernel.org il y a une section clone en bas. L'URL du bas est un miroir google git. Vous pourrez télécharger des archives pour des validations spécifiques à partir d'ici.

0

Il y a une façon de le faire:

git show ee9c5cfad29c8a13199962614b9b16f1c4137ac9 > myCommittedCode.txt