Recupera un singolo file da un repository


221

Qual è il meccanismo più efficiente (rispetto ai dati trasferiti e allo spazio su disco utilizzato) per ottenere il contenuto di un singolo file da un repository git remoto?

Finora sono riuscito a trovare:

git clone --no-checkout --depth 1 git@github.com:foo/bar.git && cd bar && git show HEAD:path/to/file.txt

Questo sembra ancora eccessivo.

Che ne dici di ottenere più file dal repository?


3
AAW. Mi piacerebbe che esistesse un modo integrato per fare l'equivalente di "cat-remote" e "tag-remote".
Conny,

3
Ho questo stesso problema, voglio avere lo stesso file di licenza in 2 repository; modifica il file in 1 repository, quindi aggiorna automaticamente la copia nell'altro repository.
GlassGhost il

Risposte:


144

nella versione 1.7.9.5 di git questo sembra funzionare per esportare un singolo file da remoto

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

Questo cat cat il contenuto del file README.md.


27
... Solo che non funziona su GitHub. Dang. :( twitter.com/GitHubHelp/status/322818593748303873
Rob Howard,

13
Questo non sembra produrre il file raw ma piuttosto un file tar con un solo file.
Frerich Raabe,

20
@FrerichRaabe basta aggiungere `| tar -x` al comando. git archive --remote=ssh://host/pathto/repo.git HEAD README.md | tar -x cat README.md
Renier,

12
È possibile utilizzare tar -xOper l'output su STDOUT per le tubazioni, ad esempioFILE=README.md && git archive --remote=ssh://host/pathto/repo.git HEAD "$FILE" | tar -xO "$FILE"
paulcm

2
Esattamente la risposta che stavo cercando, ma ottengo "fatale: operazione non supportata dal protocollo". in risposta di Git. Argh.
mhvelplund,

69

Seguendo la risposta di Jakub . produce un archivio tar o zip, quindi è necessario reindirizzare l'output attraverso tar per ottenere il contenuto del file:git archive

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

Salverà una copia di "nome file" dall'HEAD del repository remoto nella directory corrente.

La :path/to/directoryparte è facoltativa Se escluso, il file recuperato verrà salvato in<current working dir>/path/to/directory/filename

Inoltre, se si desidera abilitare l'uso dei git archive --remoterepository Git ospitati da git-daemon, è necessario abilitare l'opzione di configurazione daemon.uploadarch. Vedi https://kernel.org/pub/software/scm/git/docs/git-daemon.html


2
Se si tratta di un file di testo e vogliamo salvarlo in un'altra parte, è necessario utilizzare: | tar -xO> ~ / destfile.ext
yucer

44

Se è stata distribuita l' interfaccia Web (come gitweb, cgit, Gitorious, ginatra), è possibile utilizzarla per scaricare un singolo file (vista 'raw' o 'plain').

Se l'altro lato lo ha abilitato , è possibile utilizzare l'opzione 's' 'di git archive--remote=<URL> (e possibilmente limitarlo a una directory in cui si trova il file), ad esempio:

$ git archive --remote=git@github.com:foo/bar.git --prefix=path/to/ HEAD:path/to/ |  tar xvf -

Nota: l'esempio non è stato testato!
Jakub Narębski,

7
Per i tuoi repository devi abilitare in modo specifico upload-archive se usi git-daemon (git: // style urls) con git config daemon.uploadarch truesul repository remoto. Di default il demone git disabilita l'archivio remoto con "fatal: errore remoto: accesso negato o repository non esportato: ..."
patthoyts

+1 L' git archiveapproccio è stato il mio primo tentativo, ma poi ho notato che richiedere tarsul computer client non era esattamente conveniente per gli utenti Windows. Abbiamo finito per recuperare dal nostro cgitserver locale . Funziona, ma non è veloce come vorrei che fosse (e richiede ancora l'esecuzione unix2doso simile su macchine Windows poiché archiviamo i file con terminazioni di linea Unix nel repository Git).
Frerich Raabe,

1
@FrerichRaabe Usa -o fetched.zip. Vedi anche l'opzione --format = <fmt>.
Akhan,

5
Per quello che vale, non sembra che funzioni sui repository ospitati da GitHub. Vedi help.github.com/articles/can-i-archive-a-repository e groups.google.com/forum/#!topic/github/z8vLHcX0HxY
vmrob

30

Non in generale ma se stai usando Github:

Per me wgetl'URL non elaborato si è rivelato il modo migliore e più semplice per scaricare un determinato file.

Apri il file nel browser e fai clic sul pulsante "Raw". Ora aggiorna il tuo browser, copia l'URL e fai un wgeto curlsu di esso.

esempio wget:

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

Esempio di arricciatura:

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


3
Questa è la soluzione più semplice e funziona per qualsiasi txt raw che si possa trovare. curl https://example.com/raw.txt > savedFile.txt
JacobPariseau,

L'esempio di wget non funziona, tuttavia l'esempio di arricciatura.
Kyle Baker,

Funziona bene per me. Hai messo il tuo URL tra virgolette sulla riga di comando?
Ankur Agarwal,

questo non preserva la storia di git
crypdick il

15

Per esportare un singolo file da un telecomando:

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

Questo scaricherà il file README.mdnella directory corrente.

Se si desidera esportare il contenuto del file in STDOUT:

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

È possibile fornire più percorsi alla fine del comando.


9

Mi sembra una soluzione: http://gitready.com/intermediate/2009/02/27/get-a-file-from-a-specific-revision.html

git show HEAD~4:index.html > local_file

dove 4significa quattro revisioni da ora ed ~è una tilde come menzionato nel commento.


Assicurati di notare che NON è il 'segno meno' '-' tra 'HEAD' e '4', ma la 'tilde' '~'. Apparentemente non ho letto abbastanza bene i documenti git, oppure i miei occhiali devono essere aggiornati ;-)
Dennis

18
Questo però non sembra ottenere il file da un repository remoto, come ha bisogno l'OP.
Mike Weller,

Oppure: git show HEAD:./my_other_file > local_filese il file non è nella directory principale :)
kenorb il

1
Gentile richiesta per tutti i downvoter - spiega e chiarisci cosa non va - siamo qui per imparare e condividere :)
Mars Robertson,

9
@MichalStefanow: ce l'ha Mike Weller; in particolare, questo non funziona su un repository remoto. Hai almeno bisogno di un clone locale, anche se hai dei telecomandi configurati su di esso.
Rob Howard,

6

Io lo uso

$ 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'

Funziona per me anche senza modifiche wgetrc:wget https://raw.github.com/bk322/bk_automates/master/bkubuntu/bkubuntu.bash
Adobe

1
Il mio messaggio è più utile:ERROR: Certificate verification error for raw.github.com: unable to get local issuer certificate. To connect to raw.github.com insecurely, use '--no-check-certificate'.
Kos,

3
Funziona solo con repository pubblici. Per i repository privati ​​è necessaria l'autenticazione.
Ricardo Otero,

5

Una variante sfumata di alcune delle risposte qui che risponde alla domanda del PO:

git archive --remote=git@archive-accepting-git-server.com:foo/bar.git \
  HEAD path/to/file.txt | tar -xO path/to/file.txt > file.txt

Questo non funziona, github non supporta l'archivio git.
Philipp Flenker,

2
Err .. git è usato per qualcosa di più di GitHub
Willem van Ketwich,

1
Hai impostato esplicitamente --remote a un URL github nella tua risposta ;-)
Philipp Flenker

1
Grazie per il feedback. Hanno modificato la risposta di conseguenza.
Willem van Ketwich,

2

Se il tuo repository supporta i token (ad esempio GitLab), quindi genera un token per il tuo utente, passa al file che scarichi e fai clic sull'output RAW per ottenere l'URL. Per scaricare il file utilizzare:

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

2

Ho risolto in questo modo:

git archive --remote=ssh://git@gitlab.com/user/mi-repo.git BranchName /path-to-file/file_name | tar -xO /path-to-file/file_name > /path-to-save-the-file/file_name

Se lo desideri, puoi sostituire "BranchName" con "HEAD"


2

Mi sembra il modo più semplice per utilizzare quanto segue:

wget https://github.com/name/folder/file.zip?raw=true

1

La risposta di Yisrael Dov è semplice, ma non consente la compressione. Puoi usarlo --format=zip, ma non puoi decomprimerlo direttamente con un comando pipe come puoi con tar, quindi devi salvarlo come file temporaneo. Ecco una sceneggiatura:

#!/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

Funziona anche con le directory.


1

Per file singolo, basta usare il comando wget.

Innanzitutto, segui la foto qui sotto per fare clic su "raw" per ottenere l'URL, altrimenti scaricherai il codice incorporato in HTML. inserisci qui la descrizione dell'immagine

Quindi, il browser aprirà una nuova pagina con url start con https://raw.githubusercontent.com/ ...

basta inserire il comando nel terminale:

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

Poco dopo il file verrà inserito nella tua cartella.


Sì, funziona anche con Python, o altri linguaggi di programmazione, con una funzionalità REST. Ad esempio per scaricare moduli da diversi repository ..
Lars GJ

1

Se il tuo repository Git è ospitato su Azure-DevOps (VSTS) puoi recuperare un singolo file con l' API Rest .

Il formato di questa API è simile al seguente:

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

Per esempio:

 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

Richiede token API, non è vero?
Yuriy Pozniak,

Dipende da come esegui l'api
Shayki Abramczyk il

0

Uso curl, funziona con repository pubblici o quelli che usano l'autenticazione di base https tramite un'interfaccia web.

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

L'ho testato su Github e Bitbucket, funziona su entrambi.


0

Se vuoi ottenere un file da un hash specifico + un repository remoto ho provato git-archive e non ha funzionato.

Dovresti usare git clone e una volta clonato il repository dovresti usare git-archive per farlo funzionare.

Pubblico una domanda su come farlo in modo più semplice git da un hash specifico da remoto


0

per bitbucket direttamente dal browser (ho usato Safari ...) fai clic con il pulsante destro del mouse su "Visualizza Raw" e scegli "Scarica file collegato":

inserisci qui la descrizione dell'immagine


0

Se non ti dispiace clonare l'intera directory, questa piccola funzione bash / zsh avrà il risultato finale di clonare un singolo file nella directory corrente (clonando il repository in una directory temporanea e rimuovendolo in seguito).

Pro: ottieni solo il file desiderato

Contro: Devi ancora aspettare che l'intero repository cloni

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
}

Questa risposta può aiutare a creare cloni sparsi, cioè senza spese generali.
Yuriy Pozniak,

0

Github Enterprise Solution

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}"

Dove troviamo il GITHUB_PERSONAL_ACCESS_TOKEN?
ShadSterling

1
Puoi creare un token di accesso personale andando su https: // <your-github-server> / settings / tokens e premendo il pulsante "Genera nuovo token".
Oliver Pearmain,

Hmm, abbiamo automazioni che hanno un nome utente e una password, che vengono utilizzate per autenticarsi su più sistemi che utilizzano lo stesso SSO, quindi speravo in un modo per automatizzare la generazione di un token dato un nome utente e una password.
ShadSterling

0

Se il tuo obiettivo è solo quello di scaricare il file, c'è un'applicazione senza problemi chiamata gget:

gget github.com/gohugoio/hugo 'hugo_extended_*_Linux-ARM.deb'

L'esempio sopra dovrebbe scaricare un singolo file da hugo repository.

https://github.com/dpb587/gget


-1

In relazione alla risposta di @Steven Penny, utilizzo anche wget. Inoltre, per decidere a quale file inviare l'output utilizzo -O.

Se stai usando gitlabs un'altra possibilità per l'URL è:

wget "https://git.labs.your-server/your-repo/raw/master/<path-to-file>" -O <output-file>

A meno che non si abbia il certificato o non si acceda da un server attendibile per l'installazione di gitlabs, è necessario --no-check-certificate come ha detto @Kos. Preferisco questo piuttosto che modificare .wgetrc ma dipende dalle tue esigenze.

Se è un file di grandi dimensioni, potresti prendere in considerazione l'utilizzo dell'opzione -c con wget. Per poter continuare a scaricare il file da dove l'hai lasciato se l'intento precedente non è riuscito nel mezzo.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.