Recuperar un solo archivo de un repositorio

220

¿Cuál es el mecanismo más eficiente (con respecto a los datos transferidos y el espacio en disco utilizado) para obtener el contenido de un solo archivo desde un repositorio de git remoto?

Hasta ahora he logrado llegar a:

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

Esto todavía parece excesivo.

¿Qué hay de obtener múltiples archivos del repositorio?

dreftymac
fuente
3
Aaw Me encantaría si hubiera una forma integrada de hacer el equivalente de "cat-remote" y "tag-remote".
conny
3
Tengo este mismo problema, quiero tener el mismo archivo de licencia en 2 repositorios; edite el archivo en 1 repositorio y luego haga que actualice automáticamente la copia en el otro repositorio.
GlassGhost
Posible duplicado de ¿Cómo retirar solo un archivo del repositorio de git?
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

Respuestas:

143

en git versión 1.7.9.5 esto parece funcionar para exportar un solo archivo desde un control remoto

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

Esto capturará el contenido del archivo README.md.

Israel Dov
fuente
27
... Excepto que no funciona en GitHub. Dang :( twitter.com/GitHubHelp/status/322818593748303873
Rob Howard
13
Esto no parece producir el archivo sin procesar, sino más bien un archivo tar con un solo archivo.
Frerich Raabe
20
@FrerichRaabe solo agrega `| tar -x` al comando. git archive --remote=ssh://host/pathto/repo.git HEAD README.md | tar -x cat README.md
Renier
12
Puede usar la tar -xOsalida a STDOUT para tuberías, por ejemploFILE=README.md && git archive --remote=ssh://host/pathto/repo.git HEAD "$FILE" | tar -xO "$FILE"
paulcm
2
Exactamente la respuesta que estaba buscando, pero me sale "fatal: Operación no compatible con el protocolo". en respuesta de Git. Argh
mhvelplund
68

Siguiendo con la respuesta de Jakub . produce un archivo tar o zip, por lo que debe canalizar la salida a través de tar para obtener el contenido del archivo:git archive

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

Guardará una copia del 'nombre de archivo' del HEAD del repositorio remoto en el directorio actual.

La :path/to/directoryparte es opcional. Si se excluye, el archivo recuperado se guardará en<current working dir>/path/to/directory/filename

Además, si desea habilitar el uso de git archive --remoterepositorios Git alojados en git-daemon, debe habilitar la opción de configuración daemon.uploadarch. Ver https://kernel.org/pub/software/scm/git/docs/git-daemon.html

Robert Knight
fuente
2
Si es un archivo de texto y queremos guardarlo en otra parte, es bueno usarlo: | tar -xO> ~ / destfile.ext
yucer
44

Si hay una interfaz web implementada (como gitweb, cgit, Gitorious, ginatra), puede usarla para descargar un solo archivo (vista 'sin formato' o 'simple').

Si el otro lado lo habilitó , puede usar la opción 's' de git archive--remote=<URL> (y posiblemente limitarlo a un directorio en el que reside el archivo dado), por ejemplo:

$ git archive [email protected]:foo/bar.git --prefix=path/to/ HEAD:path/to/ |  tar xvf -
Jakub Narębski
fuente
Nota: ¡el ejemplo no fue probado!
Jakub Narębski el
77
Para sus propios repositorios, debe habilitar específicamente el archivo de carga si usa git-daemon (git: // style urls) con git config daemon.uploadarch trueen el repositorio remoto. Por defecto, git daemon desactiva el archivo remoto con "fatal: error remoto: acceso denegado o depósito no exportado: ..."
patthoyts
El git archiveenfoque fue mi primer intento, pero luego noté que exigir taren la máquina cliente no era exactamente conveniente para los usuarios de Windows. Terminamos buscando desde nuestro cgitservidor local . Funciona, pero no es tan rápido como me gustaría que fuera (y aún requiere ejecutarse unix2doso similar en máquinas Windows ya que almacenamos archivos con terminaciones de línea Unix en el repositorio de Git).
Frerich Raabe
1
@FrerichRaabe Use -o fetched.zip. Consulte también la opción --format = <fmt>.
akhan
55
Por lo que vale, no parece que esto funcione en repositorios alojados de GitHub. Consulte help.github.com/articles/can-i-archive-a-repository and groups.google.com/forum/#!topic/github/z8vLHcX0HxY
vmrob
30

No en general, pero si estás usando Github:

Para mí, wgetla URL sin procesar resultó ser la mejor y más fácil forma de descargar un archivo en particular.

Abra el archivo en el navegador y haga clic en el botón "Sin procesar". Ahora actualice su navegador, copie la url y haga una wgeto curlen ella.

ejemplo de wget:

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

Curl ejemplo:

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

Ankur Agarwal
fuente
3
Esta es la solución más fácil y funciona para cualquier txt sin formato que se pueda encontrar. curl https://example.com/raw.txt > savedFile.txt
JacobPariseau
El ejemplo de wget no funciona, aunque el ejemplo curl sí.
Kyle Baker,
Funciona bien para mí. ¿Puso su url entre comillas en la línea de comandos?
Ankur Agarwal
esto no preserva la historia de git
crypdick
15

Para exportar un solo archivo desde un control remoto:

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

Esto descargará el archivo README.mda su directorio actual.

Si desea exportar el contenido del archivo a STDOUT:

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

Puede proporcionar múltiples rutas al final del comando.

Kousha
fuente
9

Me parece una solución: http://gitready.com/intermediate/2009/02/27/get-a-file-from-a-specific-revision.html

git show HEAD~4:index.html > local_file

donde 4significa cuatro revisiones a partir de ahora y ~es una tilde como se menciona en el comentario.

Mars Robertson
fuente
Asegúrese de notar que NO es el 'signo menos' '-' entre 'CABEZA' y '4', sino la 'tilde' '~'. Aparentemente no he leído los documentos de Git lo suficientemente bien, o mis lentes necesitan una actualización ;-)
Dennis
18
Sin embargo, esto no parece obtener el archivo de un repositorio remoto, como las necesidades de OP.
Mike Weller
O: git show HEAD:./my_other_file > local_filesi el archivo no está en su directorio raíz :)
kenorb
1
Solicitud amable para todos los votantes negativos: explique y aclare lo que no está bien: estamos aquí para aprender y compartir :)
Mars Robertson
99
@MichalStefanow: Mike Weller lo tiene; específicamente, esto no funciona en un repositorio remoto. Por lo menos, necesita un clon local, incluso si tiene controles remotos configurados en él.
Rob Howard
6

yo uso esto

$ 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'
Steven Penny
fuente
Funciona para mí incluso sin ajustes de wgetrc:wget https://raw.github.com/bk322/bk_automates/master/bkubuntu/bkubuntu.bash
Adobe
1
Mi mensaje es más útil: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
Esto funciona solo para repositorios públicos. Para repositorios privados necesita autenticación.
Ricardo Otero
5

Una variante matizada de algunas de las respuestas aquí que responde a la pregunta del OP:

git archive [email protected]:foo/bar.git \
  HEAD path/to/file.txt | tar -xO path/to/file.txt > file.txt
Willem van Ketwich
fuente
Esto no funciona, github no admite git archive.
Philipp Flenker
2
Err .. git se usa para algo más que GitHub
Willem van Ketwich
1
Sin embargo, estableciste explícitamente --remote a una URL de github en tu respuesta ;-)
Philipp Flenker
1
Gracias por la respuesta. Han modificado la respuesta en consecuencia.
Willem van Ketwich
2

Si su repositorio admite tokens (por ejemplo, GitLab), genere un token para su usuario, luego navegue hasta el archivo que descargará y haga clic en la salida RAW para obtener la URL. Para descargar el archivo use:

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

Resolví de esta manera:

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 lo desea, puede reemplazar "BranchName" por "HEAD"

matiasmasca
fuente
2

Me parece la forma más fácil de usar lo siguiente:

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

La respuesta de Israel Dov es sencilla, pero no permite la compresión. Puede usarlo --format=zip, pero no puede descomprimirlo directamente con un comando de tubería como puede hacerlo con tar, por lo que debe guardarlo como un archivo temporal. Aquí hay 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

Esto funciona con directorios también.

nada101
fuente
1

Para un solo archivo, solo use el comando wget.

Primero, siga la imagen a continuación para hacer clic en "sin procesar" para obtener la URL; de lo contrario, descargará el código incrustado en html. ingrese la descripción de la imagen aquí

Luego, el navegador abrirá una nueva página con url que comienza con https://raw.githubusercontent.com/ ...

solo ingrese el comando en la terminal:

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

Un momento el archivo se colocará en su carpeta.

malajisi
fuente
Sí, esto también funciona bien en Python, u otros lenguajes de programación, con una funcionalidad REST. Por ejemplo, para descargar módulos de diferentes repositorios ..
Lars GJ
1

Si su repositorio Git está alojado en Azure-DevOps (VSTS), puede recuperar un solo archivo con la API Rest .

El formato de esta API se ve así:

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

Por ejemplo:

 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
Shayki Abramczyk
fuente
Requiere token api, ¿no?
Yuriy Pozniak
Depende de cómo
ejecutes
0

Uso curl, funciona con repositorios públicos o aquellos que usan autenticación básica https a través de una interfaz web.

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

Lo he probado en github y bitbucket, funciona en ambos.

JasonS
fuente
0

Si desea obtener un archivo de un hash específico + un repositorio remoto, probé git-archive y no funcionó.

Tendría que usar git clone y una vez que se clona el repositorio, tendría que usar git-archive para que funcione.

Publico una pregunta sobre cómo hacerlo más simple en el archivo git desde un hash específico desde remoto

Fernanda Martins
fuente
0

para bitbucket directamente desde el navegador (utilicé safari ...) haga clic con el botón derecho en 'Ver sin formato "y seleccione" Descargar archivo vinculado ":

ingrese la descripción de la imagen aquí

ingconti
fuente
0

Si no le importa clonar todo el directorio, esta pequeña función bash / zsh tendrá el resultado final de clonar un solo archivo en su directorio actual (clonando el repositorio en un directorio temporal y eliminándolo después).

Pro: solo obtienes el archivo que deseas

Con: todavía tienes que esperar a que todo el repositorio se clone

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
}
Christopher Shroba
fuente
Esta respuesta puede ayudar a hacer un clon disperso, es decir, sin gastos generales.
Yuriy Pozniak
0

Solución empresarial Github

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}"
Oliver Pearmain
fuente
¿Dónde encontramos el GITHUB_PERSONAL_ACCESS_TOKEN?
ShadSterling
1
Puede crear un token de acceso personal yendo a https: // <your-github-server> / settings / tokens y presionando el botón "Generar nuevo token".
Oliver Pearmain
Hmm, tenemos automatizaciones que reciben un nombre de usuario y una contraseña, que se utilizan para autenticar en múltiples sistemas que usan el mismo SSO, por lo que esperaba una forma de automatizar la generación de un token dado un nombre de usuario y contraseña.
ShadSterling
0

Si su objetivo es simplemente descargar el archivo, hay una aplicación sin problemas llamada gget:

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

El ejemplo anterior descargaría un solo archivo del hugorepositorio.

https://github.com/dpb587/gget

Granitosaurio
fuente
-1

En relación con la respuesta de @Steven Penny, también uso wget. Además, para decidir a qué archivo enviar la salida, uso -O.

Si está utilizando gitlabs, otra posibilidad para la url es:

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

A menos que tenga el certificado o acceda desde un servidor de confianza para la instalación de gitlabs que necesita, no verifique el certificado, como dijo @Kos. Prefiero eso en lugar de modificar .wgetrc pero depende de tus necesidades.

Si es un archivo grande, puede considerar usar la opción -c con wget. Para poder continuar descargando el archivo desde donde lo dejó si la intención anterior falló en el medio.

Hector llorens
fuente