2010-07-26 17 views
184

El escenario:Git: ¿Cómo actualizar/verificar un único archivo desde el origen maestro remoto?

  1. que hacer algunos cambios en un solo archivo localmente y ejecutar git add, git commit y git push
  2. El archivo es empujado al repositorio principal origen remoto
  3. tengo otro repositorio local que es implementado a través de Capistrano con el método "remote_cache" de ese repositorio remoto
  4. Ahora no quiero implementar toda la aplicación, solo actualizar/verificar ese único archivo.

Por favor, ¿esto de alguna manera es posible con git? No pude encontrar nada que funcionara ni pude resolverlo. Con SVN acabo de hacer svn up file y listo.

Estaré encantado de cualquier ayuda, gracias!

+13

Es posible que desee considerar cambiar la respuesta aceptada por la que realmente responde a su pregunta. ;) – steps

+4

Después de más de 6 años, creo que podemos suponer con seguridad que esto no sucederá @steps ... –

+3

tiene que ser la respuesta aceptada con la puntuación más baja. –

Respuesta

-63

Git no funciona en archivos individuales. No conozco la configuración remote_cache, así que no puedo comentar sobre eso. Sin embargo, en git, tiene que clone el repositorio completo, hacer un cambio en un archivo (s), confirmarlo (esto es una operación local) y luego empujar los cambios hacia atrás.

En su configuración, usted debería poder simplemente pull los cambios del repositorio principal (llámelo M) a su repositorio implementado en capistrano (llámelo B). No veo por qué estás teniendo el problema. Si B es sustancialmente diferente y no quiere estropearlo, puede agregar M como remote a B y luego cherry-pick las confirmaciones específicas que le interesan (es decir, la actualización del archivo del que está hablando) a B. ¿Eso funcionaría para ti?

+1

¡Gracias! Bueno, no estoy interesado en un compromiso en particular como un todo, me gustaría actualizar un solo archivo a su revisión HEAD (incluso si la confirmación completa contiene más que solo este único archivo) en la rama principal desde el origen remoto . Creo que estoy malinterpretando git con ideas de svn. Tendré que experimentar con eso un poco más. – foresth

+0

Git mantiene instantáneas del sistema de archivos (el repositorio) en lugar de historiales de archivos individuales, por lo que su navegación solo puede estar entre estas instantáneas. Cf. http://progit.org/book/ch1-3.html –

+5

Encontré la respuesta de @qzio muy útil para una situación similar que tuve; tenía cero votos, sin embargo, ¿por qué es eso? -¿Puede ser una mala práctica o algo así? – lfborjas

6

Lo que puede hacer es:

  1. actualización de su repositorio git locales:

    git fetch

  2. Construir una sucursal local y la salida en él:

    git branch pouet && git checkout pouet

  3. Aplicar el commit que desea en esta rama:

    git cherry-pick abcdefabcdef

    (abcdefabcdef es el sha1 de una confirmación que desea aplicar)

+4

Como un aparte, su segundo paso también se puede hacer en un comando como 'git checkout -b pouet'. –

+2

'pouet' es el mejor nombre de sucursal para este ejemplo. – Hussard

589

Es posible hacer (en el repositorio desplegado)

git fetch 
git checkout origin/master -- path/to/file 

El fetch descargar todos los cambios recientes, pero no va a ponerlo en su código desprotegido actual (área de trabajo).

La comprobación actualizará el árbol de trabajo con el archivo particular de los cambios descargados (origin/master).

Al menos esto funciona para mí para esos pequeños arreglos tipográficos pequeños, donde se siente extraño crear una rama, etc. solo para cambiar una palabra en un archivo.

+4

y luego, ¿qué pasaría con el código obtenido? –

+0

Muy útil, esto funcionó muy bien. Necesitaba obtener un archivo composer.json y ejecutar una actualización antes de actualizar el resto del sitio en producción. Si hubiera puesto manualmente los archivos composer.json/lock en su lugar, cuando hice un pull, entraría en conflicto diciendo que los archivos ya existían. Al hacerlo de esta manera, git reconoció los archivos sin una queja. – David

+4

Esta es la respuesta que estaba buscando. – javadba

1

O git stash (si tiene cambios) en la sucursal en la que se encuentra, realice el pago principal, busque los últimos cambios, tome ese archivo en su escritorio (o en toda la aplicación). Verifica la sucursal en la que estabas. Git stash vuelve al estado en el que estaba, luego arregla los cambios manualmente o lo arrastra reemplazando el archivo.

De esta forma no es tan guay pero definitivamente funciona si ustedes no pueden entender nada más.

13
git archive --format=zip --remote=ssh://<user>@<host>/repos/<repo name> <tag or HEAD> <filename> > <output file name>.zip 
+0

¡Esta debería ser la respuesta aceptada! –

+0

Esta es una buena solución para repos clonado en ssh, pero parece que esto no es compatible con https: 'git archive --remote = https: //github.com/git/git.git master: git/contrib/completion git-completion.bash | tar -x' Da me mensaje de error: 'fatal: Operación no compatible con el protocolo' – Alderath

-1

Creo que he encontrado un truco fácil.

Eliminar el archivo que tiene en el repositorio local (el archivo que desea que se actualicen desde la última comprometerse en el servidor remoto)

y luego hacer un git pull

Debido a que se elimina el archivo, hay no habrá conflicto

+0

Eso elimina todos los cambios eventuales realizados en ese archivo localmente, y también extrae todos los demás archivos, que es específicamente lo que el OP no hace quiero hacer. – legrojan

Cuestiones relacionadas