¿Cómo retirar escasamente un solo archivo de un repositorio de Git?

Resuelto Arthur Ulfeldt asked hace 14 años • 27 respuestas

¿Cómo puedo retirar solo un archivo de un repositorio de Git?

Arthur Ulfeldt avatar Mar 18 '10 06:03 Arthur Ulfeldt
Aceptado

Originalmente, mencioné en 2012 git archive(ver la respuesta de Jared Forsyth y la respuesta de Robert Knight ), desde git1.7.9.5 (marzo de 2012) , la respuesta de Paul Brannan :

git archive --format=tar --remote=origin HEAD:path/to/directory -- filename | tar -O -xf -

Pero: en 2013, eso ya no era posible para las URL https://github.com remotas .
Consulte la página anterior "¿ Puedo archivar un repositorio? "

La página actual (2018) " Acerca del archivado de contenido y datos en GitHub " recomienda utilizar servicios de terceros como GHTorrent o GH Archive .


Entonces también puedes lidiar con copias/clonaciones locales:

Alternativamente, puede hacer lo siguiente si tiene una copia local del repositorio básico como se menciona en esta respuesta ,

git --no-pager --git-dir /path/to/bar/repo.git show branch:path/to/file >file

O debes clonar primero el repositorio, lo que significa que obtendrás el historial completo:

  • en el repositorio .git

  • en el árbol de trabajo.

  • Pero luego puedes hacer un pago escaso (si estás usando Git1.7+):

    • habilitar la opción de pago disperso ( git config core.sparsecheckout true)
    • agregando lo que quieres ver en el .git/info/sparse-checkoutarchivo
    • releer el árbol de trabajo para mostrar solo lo que necesita

Para volver a leer el árbol de trabajo:

$ git read-tree -m -u HEAD

De esa manera, terminará con un árbol de trabajo que incluye exactamente lo que desea (incluso si es solo un archivo).


Richard Gomes señala ( en los comentarios ) "¿ Cómo clono, obtengo o extraigo un solo directorio o una lista de directorios del repositorio de git? "

Una función bash que evita descargar el historial, que recupera una sola rama y que recupera una lista de archivos o directorios que necesita.


Con Git 2.40 (primer trimestre de 2023), la lógica para ver si estamos usando el modo "cono" al verificar los patrones de escasez se ha reforzado para evitar confundir un patrón que nombra un solo archivo con la especificación de un cono.

Consulte el compromiso 5842710 (3 de enero de 2023) de William Sprent ( williams-unity) .
(Fusionado por Junio ​​C Hamano -- gitster-- en el compromiso ab85a7d , 16 de enero de 2023)

dir: compruebe si hay patrones de cono de una sola fila

Firmado por: William Spren
Añadido por: Victoria Dye

La escasa documentación de pago indica que el conjunto de patrones del modo cono se limita a patrones que incluyen directorios de forma recursiva o patrones que coinciden con todos los archivos de un directorio.
En el archivo de pago disperso, el primero se manifiesta en la forma:

/A/B/C/

mientras que estos últimos se convierten en un par de patrones en la forma:

/A/B/
!/A/B/*/

o en el caso especial de hacer coincidir los archivos de nivel superior:

/*
!/*/

La add_pattern_to_hashsets()función ' ' contiene comprobaciones que sirven para desactivar el modo cono cuando se encuentran patrones que no son conos.
Sin embargo, estos no se detectan cuando la lista de patrones intenta hacer coincidir un solo archivo o directorio, por ejemplo, un patrón en la forma:

/A/B/C

Esto hace que el pago disperso muestre un comportamiento inesperado cuando dicho patrón está en el archivo de pago disperso y el modo de cono está habilitado.

Concretamente, con un patrón como el anterior, el pago disperso, en modo sin cono, solo incluirá el directorio o archivo ubicado en ' /A/B/C'.
Sin embargo, con el modo cono habilitado, el proceso de pago disperso solo manifestará los archivos de nivel superior, pero no los archivos ubicados en ' /A/B/C'.

De manera relacionada, ocurren problemas al suministrar el mismo tipo de filtro cuando se realiza una clonación parcial con ' --filter=sparse:oid=<oid>'.
' upload-pack' incluirá correctamente solo los objetos que coincidan con la coincidencia de patrones que no son de cono.
Lo que significa que verificar el repositorio recién clonado con el mismo filtro, pero con el modo cono habilitado, falla debido a que faltan objetos.

Para solucionar estos problemas, agregue una verificación de patrón en modo cono que afirme que cada patrón es una coincidencia de directorio o el patrón ' /*'.
Agregue una prueba para verificar la nueva verificación de patrón y modifique otra para reflejar que los patrones que no son de directorio se detectan antes.

VonC avatar Mar 18 '2010 04:03 VonC

Primero clone el repositorio con la opción -n, que suprime la extracción predeterminada de todos los archivos, y la opción --profundidad 1, que significa que solo obtiene la revisión más reciente de cada archivo.

git clone -n git://path/to/the_repo.git --depth 1

Luego revisa solo el archivo que deseas así:

cd the_repo
git checkout HEAD name_of_file
Nick Moore avatar Mar 17 '2010 23:03 Nick Moore

Si ya tiene una copia del repositorio de git, siempre puede obtener una versión de un archivo usando a git logpara averiguar el hash-id (por ejemplo, 3cdc61015724f9965575ba954c8cd4232c8b42e4) y luego simplemente escriba:

git checkout hash-id path-to-file

Aquí hay un ejemplo real:

git checkout 3cdc61015724f9965575ba954c8cd4232c8b42e4 /var/www/css/page.css
techexpert avatar Jun 27 '2012 19:06 techexpert

Normalmente no es posible descargar solo un archivo gitsin descargar todo el repositorio como se sugiere en la primera respuesta. Es porque Git no almacena archivos como crees (como lo hacen CVS/SVN), sino que los genera basándose en todo el historial del proyecto.

Pero existen algunas soluciones para casos específicos. A continuación se muestran ejemplos con marcadores de posición para user, project, branch, filename.

GitHub

wget https://raw.githubusercontent.com/user/project/branch/filename

GitLab

wget https://gitlab.com/user/project/raw/branch/filename

GitWeb

Si está utilizando Git en el servidor - GitWeb , puede probar con el ejemplo (cambiarlo a la ruta correcta):

wget "http://example.com/gitweb/?p=example;a=blob_plain;f=README.txt;hb=HEAD"

GitWeb en drupalcode.org

Ejemplo:

wget "http://drupalcode.org/project/ads.git/blob_plain/refs/heads/master:/README.md"

googlesource.com

Hay una característica no documentada que le permite descargar versiones codificadas en base64 de archivos sin formato:

curl "https://chromium.googlesource.com/chromium/src/net/+/master/http/transport_security_state_static.json?format=TEXT" | base64 --decode

En otros casos, verifique si su repositorio Git utiliza alguna interfaz web.

Si no utiliza ninguna interfaz web, puede considerar enviar su código a servicios externos como GitHub , Bitbucket , etc. y usarlo como espejo.

Si no lo tienes wgetinstalado, prueba curl -O (url)alternativamente.

kenorb avatar Feb 08 '2013 19:02 kenorb