Récupérer un seul fichier à partir d’un référentiel

Quel est le mécanisme le plus efficace (en ce qui concerne les données transférées et l’espace disque utilisé) pour obtenir le contenu d’un seul fichier à partir d’un référentiel git distant?

Jusqu’à présent, j’ai réussi à trouver:

git clone --no-checkout --depth 1 [email protected]:foo/bar.git && cd bar && git show HEAD:path/to/file.txt 

Cela semble encore exagéré.

Qu’en est-il de l’obtention de plusieurs fichiers à partir du repository?

dans git version 1.7.9.5, cela semble fonctionner pour exporter un seul fichier depuis une télécommande

 git archive --remote=ssh://host/pathto/repo.git HEAD README.md 

Cela va README.md le contenu du fichier README.md .

Suite à la réponse de Jakub . git archive produit une git archive tar ou zip, vous devez donc canaliser la sortie via tar pour obtenir le contenu du fichier:

 git archive --remote=git://git.foo.com/project.git HEAD:path/to/directory filename | tar -x 

Enregistre une copie de ‘nomfichier’ depuis le HEAD du référentiel distant dans le répertoire en cours.

La partie :path/to/directory est facultative. S’il est exclu, le fichier récupéré sera enregistré dans /path/to/directory/filename

De plus, si vous souhaitez activer l’utilisation de git archive --remote sur les référentiels Git hébergés par git-daemon, vous devez activer l’option de configuration daemon.uploadarch. Voir https://kernel.org/pub/software/scm/git/docs/git-daemon.html

Si une interface Web est déployée (comme gitweb, cgit, Gitorious, ginatra), vous pouvez l’utiliser pour télécharger un fichier unique (vue «brute» ou «simple»).

Si un autre côté le permet , vous pouvez utiliser l’option --remote= ‘de git archive (et éventuellement la limiter à un répertoire dans --remote= trouve le fichier), par exemple:

 $ git archive [email protected]:foo/bar.git --prefix=path/to/ HEAD:path/to/ | tar xvf - 

Pas en général mais si vous utilisez Github:

Pour moi, wget à l’url brut s’est avéré être le meilleur et le plus simple moyen de télécharger un fichier particulier.

Ouvrez le fichier dans le navigateur et cliquez sur le bouton “Raw”. Maintenant, actualisez votre navigateur, copiez l’URL et faites un wget ou un curl dessus.

wget exemple:

wget 'https://github.abc.abc.com/raw/abc/folder1/master/folder2/myfile.py?token=DDDDnkl92Kw8829jhXXoxBaVJIYW-h7zks5Vy9I-wA%3D%3D' -O myfile.py

Exemple Curl:

curl 'https://example.com/raw.txt' > savedFile.txt

Pour exporter un seul fichier depuis une télécommande:

 git archive --remote=ssh://host/pathto/repo.git HEAD README.md | tar -x 

Cela téléchargera le fichier README.md dans votre répertoire actuel.

Si vous souhaitez que le contenu du fichier soit exporté vers STDOUT:

 git archive --remote=ssh://host/pathto/repo.git HEAD README.md | tar -xO 

Vous pouvez fournir plusieurs chemins à la fin de la commande.

Cela me semble une solution: http://gitready.com/intermediate/2009/02/27/get-a-file-from-a-specific-revision.html

git show HEAD ~ 4: index.html> fichier_local

4 signifie quatre révisions à partir de maintenant et ~ est un tilde comme mentionné dans le commentaire.

Je l’utilise

 $ cat ~/.wgetrc check_certificatee = off $ wget https://raw.github.com/jquery/jquery/master/grunt.js HTTP request sent, awaiting response... 200 OK Length: 11339 (11K) [text/plain] Saving to: `grunt.js' 

Une variante nuancée de certaines des réponses ici répond à la question du PO:

 git archive [email protected]:foo/bar.git HEAD path/to/file.txt | tar -xO path/to/file.txt > file.txt 

Si votre référentiel prend en charge les jetons (par exemple, GitLab), générez un jeton pour votre utilisateur, puis accédez au fichier que vous allez télécharger et cliquez sur la sortie RAW pour obtenir l’URL. Pour télécharger le fichier, utilisez:

 curl --silent --request GET --header 'PRIVATE-TOKEN: replace_with_your_token' \ 'http://git.example.com/foo/bar.sql' --output /tmp/bar.sql 

La réponse de Yisrael Dov est simple, mais elle ne permet pas la compression. Vous pouvez utiliser --format=zip , mais vous ne pouvez pas le dézipper directement avec une commande pipe comme avec tar, vous devez donc l’enregistrer en tant que fichier temporaire. Voici un script:

 #!/bin/bash BASENAME=$0 function usage { echo "usage: $BASENAME   ..." exit 1 } [ 2 -gt "$#" ] && { usage; } REPO=$1 shift FILES=$@ TMPFILE=`mktemp`.zip git archive -9 --remote=$REPO HEAD $FILES -o $TMPFILE unzip $TMPFILE rm $TMPFILE 

Cela fonctionne aussi avec les répertoires.

J’utilise curl, cela fonctionne avec les repositorys publics ou ceux qui utilisent l’authentification de base https via une interface Web.

curl -L --retry 20 --retry-delay 2 -O https://github.com/ACCOUNT/REPO/raw/master/PATH/TO/FILE/FILE.TXT -u USER:PASSWORD

Je l’ai testé sur github et bitbucket, fonctionne sur les deux.

Si vous voulez obtenir un fichier à partir d’un hash spécifique + un repository distant, j’ai essayé git-archive et cela n’a pas fonctionné.

Vous devrez utiliser git clone et une fois le référentiel cloné, vous devrez alors utiliser git-archive pour le faire fonctionner.

Je poste une question sur la façon de le faire plus simple dans git archive à partir d’un hachage spécifique à distance

Pour un fichier unique, utilisez simplement la commande wget.

Tout d’abord, suivez l’image ci-dessous pour cliquer sur “raw” pour obtenir l’URL, sinon vous téléchargerez le code incorporé dans le HTML. entrer la description de l'image ici

Ensuite, le navigateur ouvrira une nouvelle page avec l’ adresse URL commençant par https://raw.githubusercontent.com/

Il suffit d’entrer la commande dans le terminal:

 #wget https://raw.githubusercontent.com/... 

A tant que le fichier sera placé dans votre dossier.

pour bitbucket directement depuis le navigateur (j’ai utilisé Safari …), cliquez avec le bouton droit de la souris sur “View Raw” et choisissez “Download Linked File”:

entrer la description de l'image ici

Relatif à la réponse de @Steven Penny, j’utilise aussi wget. De plus, pour décider quel fichier envoyer la sortie à I utilise -O.

Si vous utilisez gitlabs, une autre possibilité pour l’URL est:

 wget "https://git.labs.your-server/your-repo/raw/master/" -O  

À moins que vous n’ayez le certificate ou que vous n’accédiez à un serveur de confiance pour l’installation de gitlabs, vous avez besoin de l’option –no-check-certificatee, comme l’a dit @Kos. Je préfère cela plutôt que de modifier .wgetrc mais cela dépend de vos besoins.

Si c’est un gros fichier, vous pouvez envisager d’utiliser l’option -c avec wget. Pour pouvoir continuer à télécharger le fichier depuis l’endroit où vous l’avez laissé si l’intention précédente a échoué au milieu.