web-dev-qa-db-fra.com

Récupérer un seul fichier depuis 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 fichier unique à 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 d'obtenir plusieurs fichiers à partir du référentiel?

186
Theozaurus

dans la version 1.7.9.5 de Git, 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 chatter le contenu du fichier README.md.

126
Yisrael Dov

Suite de Jakub 's answer . git archive génère une archive tar ou zip, vous devez donc diriger 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

Sauvegardera une copie de 'nom_fichier' à partir du HEAD du référentiel distant dans le répertoire actuel.

La partie :path/to/directory est facultative. Si exclu, le fichier récupéré sera enregistré dans <current working dir>/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

51
Robert Knight

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 l'autre côté activé, vous pouvez utiliser l'option '--remote=<URL>' de git archive (et éventuellement la limiter à un répertoire dans lequel le fichier réside), par exemple:

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

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

Pour moi, wget à l'URL brut s'est avéré être le meilleur moyen et le plus facile 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 une wget ou 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

Curl exemple:

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

20
abc

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.

11
Kousha

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 indiqué dans le commentaire.

8
Michal Stefanow

Je l'utilise

$ cat ~/.wgetrc
check_certificate = 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'
6
Steven Penny

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
3
Willem van Ketwich

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
2
panticz.de

J'ai résolu de cette façon:

git archive --remote=ssh://[email protected]/user/mi-repo.git BranchName /path-to-file/file_name | tar -xO /path-to-file/file_name > /path-to-save-the-file/file_name

Si vous le souhaitez, vous pouvez remplacer "BranchName" par "HEAD" 

1
matiasmasca

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

#!/bin/bash

BASENAME=$0

function usage {
    echo "usage: $BASENAME <remote-repo> <file> ..."
    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 annuaires.

1
naught101

Si votre référentiel Git est hébergé sur Azure-DevOps (VSTS), vous pouvez récupérer un seul fichier avec Rest API .

Le format de cette API ressemble à ceci:

 https://dev.Azure.com/{organization}/_apis/git/repositories/{repositoryId}/items?path={pathToFile}&api-version=4.1?download=true

Par exemple:

 https://dev.Azure.com/{organization}/_apis/git/repositories/278d5cd2-584d-4b63-824a-2ba458937249/items?scopePath=/MyWebSite/MyWebSite/Views/Home/_Home.cshtml&download=true&api-version=4.1
1
Shayki Abramczyk

Pour un seul fichier, utilisez simplement la commande wget.

Tout d’abord, suivez la photo ci-dessous pour cliquer sur "raw" afin d’obtenir l’URL, sinon vous téléchargerez le code intégré au format HTML.  enter image description here

Ensuite, le navigateur ouvrira une nouvelle page dont l’url commence par https://raw.githubusercontent.com/ ...

entrez simplement la commande dans le terminal:

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

Un moment, le fichier sera mis dans votre dossier.

1
malajisi

Si vous voulez obtenir un fichier depuis un hachage spécifique + un dépôt distant, j'ai essayé git-archive et cela ne fonctionnait pas.

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 archive git à partir d’un hachage spécifique à distance

0
Fernanda Martins

Si cela ne vous dérange pas de cloner tout le répertoire, cette petite fonction bash/zsh aura pour résultat final de cloner un seul fichier dans votre répertoire actuel (en clonant le référentiel dans un répertoire temporaire et en le supprimant par la suite).

Pro: Vous n'obtenez que le fichier que vous voulez

Con: Vous devez encore attendre que le repo entier à cloner

git-single-file () {
        if [ $# -lt 2 ]
        then
                echo "Usage: $0 <repo url> <file path>"
                return
        fi
        TEMP_DIR=$(mktemp -d)
        git clone $1 $TEMP_DIR
        cp $TEMP_DIR/$2 .
        rm -rf $TEMP_DIR
}
0
Christopher Shroba

J'utilise curl, cela fonctionne avec les pensions publiques ou celles utilisant 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.

0
JasonS

Solution Github Enterprise

HTTPS_DOMAIN=https://git.your-company.com
ORGANISATION=org
REPO_NAME=my-amazing-library
FILE_PATH=path/to/some/file
BRANCH=develop
GITHUB_PERSONAL_ACCESS_TOKEN=<your-access-token>

URL="${HTTPS_DOMAIN}/raw/${ORGANISATION}/${REPO_NAME}/${BRANCH}/${FILE_PATH}"

curl -H "Authorization: token ${GITHUB_PERSONAL_ACCESS_TOKEN}" ${URL} > "${FILE_PATH}"
0
Oliver Pearmain

pour bitbucket directement depuis le navigateur (j’ai utilisé safari ...), cliquez avec le bouton droit de la souris sur 'View Raw "et choisissez" Télécharger le fichier lié ":

 enter image description here

0
ingconti