¿Cómo extraer un solo archivo de un repositorio de servidor en Git?

114

Estoy trabajando en un sitio con un servidor que ejecuta Git. Estoy usando Git para la implementación (no GitHub). Esto se configuró antes de mi participación mediante un método de enlace , y me referí a esta pregunta e ingresé los comandos a continuación, pero no funcionó.

¿Cómo extraigo un solo archivo del servidor? Por ejemplo, si quisiera actualizar mi archivo local index.php? git pull index.php?

vsvs
fuente
1
Posible duplicado de ¿Es posible extraer solo un archivo en Git?
Mateusz Piotrowski
Posible duplicado de ¿Cómo retirar solo un archivo del repositorio de git?
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

Respuestas:

194

Es posible hacer (en el repositorio desplegado):

git fetch
// git fetch will download all the recent changes, but it will not put it in your current checked out code (working area).

Seguido por:

git checkout origin/master -- path/to/file
// git checkout <local repo name (default is origin)>/<branch name> -- path/to/file will checkout the particular file from the downloaded changes (origin/master).
chrismillah
fuente
1
Gracias. Entonces, ¿a qué te refieres con <revision>? el nombre del archivo? Y si mi archivo está en el directorio raíz, ¿eso significa que tengo que escribir git checkout -m index.php index.php:?
vsvs
Gracias por la explicación.
vsvs
¿Tiene que ser *origin*/mastero puede ser desde cualquier remoto? ¿El historial completo está en mi repositorio o el archivo parece aparecer mágicamente?
Bernhard Döbler
Si recibe este error "no coincide con ningún archivo conocido por git": "ruta / a / archivo" no debe ser la copia de la ruta que obtiene de la ubicación del archivo en GitHub, lo que significa "repoName / fileName" , debe deshacerse de "repoName /" y luego funcionará.
Eduard
1
@ BernhardDöbler puede ser cualquier rama remota :)
chrismillah
27
git fetch --all
git checkout origin/master -- <your_file_path>
git add <your_file_path>
git commit -m "<your_file_name> updated"

Esto es asumiendo que está extrayendo el archivo de origen / maestro.

OYORF
fuente
13

Esta puede ser la solución:

git fetch

git checkout origin/master -- FolderPathName/fileName

Gracias.

Y. Joy Ch. Singha
fuente
5

Este escenario surge cuando usted, o fuerzas más grandes que usted, ha destruido un archivo en su repositorio local y solo desea restaurar una copia nueva de la última versión del repositorio. Simplemente eliminar el archivo con / bin / rm (no git rm) o renombrarlo / ocultarlo y luego emitir un git pullno funcionará: git nota la ausencia del archivo y asume que probablemente quieras que desaparezca del repositorio ( git diffmostrará todas las líneas eliminadas del archivo perdido).

git pullno restaurar los archivos que faltan localmente siempre me ha frustrado acerca de git, tal vez porque he sido influenciado por otros sistemas de control de versiones (por ejemplo, la actualización svn, que creo que restaurará los archivos que se han ocultado localmente).

git reset --hard HEADes una forma alternativa de restaurar el archivo de interés, ya que elimina los cambios no confirmados que tenga. Sin embargo, como se indica aquí , git reset es un comando potencialmente peligroso si tiene otros cambios no confirmados que le interesen.

La git fetch ... git checkoutestrategia mencionada anteriormente por @chrismillah es una buena forma quirúrgica de restaurar el archivo en cuestión.

Trutano
fuente
1
mucho más esplicativo que otros comentarios. Gracias
Thecave3
3

Estaba buscando una tarea ligeramente diferente, pero esto se parece a lo que quieres:

git archive --remote=$REPO_URL HEAD:$DIR_NAME -- $FILE_NAME |
tar xO > /where/you/want/to/have.it

Quiero decir, si desea buscar path/to/file.xz, establecerá DIR_NAMEen path/toy FILE_NAMEen file.xz. Entonces, terminarás con algo como

git archive --remote=$REPO_URL HEAD:path/to -- file.xz |
tar xO > /where/you/want/to/have.it

Y nadie te impide otra forma de desempacar en lugar de, tar xOpor supuesto (fui yo quien necesitaba una pipa aquí, sí).

jno
fuente
1

Intente usar:

git checkout branchName -- fileName

Ex:

git checkout master -- index.php
Dodda Venkata
fuente
2
Atención: "git checkout master - index.php" este no realiza el pago desde el servidor, sino desde la base de datos local de git desde la última extracción.
Roberto Novakosky
0

Este lote de Windows funciona independientemente de si está o no en GitHub. Lo estoy usando porque muestra algunas advertencias severas. Notará que la operación es lenta y atraviesa cientos de megabytes de datos , así que no use este método si sus requisitos se basan en el ancho de banda disponible / memoria RW.

sparse_checkout.bat

pushd "%~dp0"
if not exist .\ms-server-essentials-docs mkdir .\ms-server-essentials-docs
pushd .\ms-server-essentials-docs
git init
git remote add origin -f https://github.com/MicrosoftDocs/windowsserverdocs.git
git config core.sparseCheckout true
(echo EssentialsDocs)>>.git\info\sparse-checkout
git pull origin master

=>

C: \ Usuarios \ nombre de usuario \ Escritorio> sparse_checkout.bat

C: \ Usuarios \ nombre de usuario \ Escritorio> pushd "C: \ Usuarios \ nombre de usuario \ Escritorio \"

C: \ Usuarios \ nombre de usuario \ Escritorio> si no existe. \ Ms-server-essentials-docs mkdir. \ Ms-server-essentials-docs

C: \ Usuarios \ nombre de usuario \ Escritorio> pushd. \ Ms-server-essentials-docs

C: \ Users \ nombre de usuario \ Desktop \ ms-server-essentials-docs> git init Repositorio de Git vacío inicializado en C: / Users / nombre de usuario / Desktop / ms-server-essentials-docs / .git /

C: \ Users \ nombre de usuario \ Desktop \ ms-server-essentials-docs> git remote add origin -f https://github.com/MicrosoftDocs/windowsserverdocs.git Actualizando origen remoto: enumerando objetos: 97, hecho. remoto: Contando objetos: 100% (97/97), hecho. remoto: Comprimir objetos: 100% (44/44), listo. remoto: Total 145517 (delta 63), reutilizado 76 (delta 53), paquete reutilizado 145420 Recibiendo objetos: 100% (145517/145517), 751,33 MiB | 32,06 MiB / s, hecho. Resolución de deltas: 100% (102110/102110), hecho. De https://github.com/MicrosoftDocs/windowsserverdocs * [nueva rama]
1106-conflicto -> origen / 1106-conflicto * [nueva rama]
FromPrivateRepo -> origen / FromPrivateRepo * [nueva rama]
PR183 -> origen / PR183 * [nueva sucursal]
conflictfix -> origin / conflictfix * [nueva rama]
eross-msft-patch-1 -> origin / eross-msft-patch-1 * [nueva rama]
maestro -> origen / maestro * [nueva rama] parche-1
-> origin / patch-1 * [nueva rama] repo_sync_working_branch -> origin / repo_sync_working_branch * [nueva rama]
shortpatti-patch-1 -> origin / shortpatti-patch-1 * [nueva rama]
shortpatti-patch-2 -> origen / shortpatti -patch-2 * [nueva rama]
shortpatti-patch-3 -> origen / shortpatti-patch-3 * [nueva rama]
shortpatti-patch-4 -> origen / shortpatti-patch-4 * [nueva rama]
shortpatti-patch -5 -> origin / shortpatti-patch-5 * [nueva rama]
shortpatti-patch-6 -> origin / shortpatti-patch-6 * [nueva rama]
shortpatti-patch-7 -> origen / shortpatti-patch-7 * [nueva rama]
shortpatti-patch-8 -> origen / shortpatti-patch-8

C: \ Users \ nombre de usuario \ Desktop \ ms-server-essentials-docs> git config core.sparseCheckout true

C: \ Users \ nombre de usuario \ Desktop \ ms-server-essentials-docs> (echo EssentialsDocs) 1 >>. Git \ info \ sparse-checkout

C: \ Users \ nombre de usuario \ Desktop \ ms-server-essentials-docs> git pull origin master
De https://github.com/MicrosoftDocs/windowsserverdocs
* branch master -> FETCH_HEAD

kayleeFrye_onDeck
fuente