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?
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
.
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
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 -
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
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
où 4
signifie quatre révisions à partir de maintenant et ~
est un tilde comme indiqué dans le commentaire.
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'
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
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"
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.
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
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.
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.
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
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
}
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.
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}"