git pull manteniendo los cambios locales no confirmados

6 minutos de lectura

Avatar de usuario de Johnny Everson
johnny everson

¿Cómo puedo actualizar (extraer) de manera segura un proyecto de git, manteniendo intactos archivos específicos, incluso si hay cambios anteriores?

myrepo/config/config.php

¿Hay alguna forma de que, incluso si este archivo se cambiara de forma remota, cuando hago git pull, todo lo demás se actualiza, pero este archivo no cambia (ni siquiera se fusiona)?

PD. Necesito hacer lo que pido porque solo estoy escribiendo scripts de implementación basados ​​​​en git. No puedo cambiar los archivos de configuración a plantillas.

entonces, necesito una forma de escribir scripts de actualización que no pierdan lo que se cambió localmente. Esperaba algo tan simple como:

git assume-remote-unchanged file1
git assume-remote-unchanged file2

entonces git pull

  • ¿Son los cambios de config.php ¿comprometido?

    –Mark Longair

    2 de mayo de 2012 a las 13:58

  • posible duplicado de ¿Es posible excluir confirmaciones específicas al realizar una combinación de git?

    – Daenith

    2 de mayo de 2012 a las 13:58

  • No está comprometido. Preferiría no tener que

    – Johnny Everson

    2 mayo 2012 a las 14:12

  • @JhonnyEverson: es la misma clase general de problema (tiene un archivo de configuración y no desea confirmar configuraciones específicas, pero es necesario realizar un seguimiento de la estructura del archivo de configuración).

    – Daenith

    2 mayo 2012 a las 16:10

Avatar de usuario de GoZoner
GoZoner

Hay una solución simple basada en Git Stash. Guarde todo lo que ha cambiado, extraiga todas las cosas nuevas, aplique su reserva.

git stash
git pull
git stash pop

En stash pop puede haber conflictos. En el caso que usted describe, de hecho habría un conflicto para config.php. Pero resolver el conflicto es fácil porque sabes que lo que pones en el alijo es lo que quieres. Así que haz esto:

git checkout --theirs -- config.php

  • ese comando git checkout –theirs es muy confuso. Hizo lo que quería una vez y algo realmente malo en otra ocasión. ¿Tienes alguna buena documentación al respecto?

    – milimétrico

    19/09/2013 a las 15:00

  • Sí, a veces “suyos” y “nuestros” pueden ser confusos. en un git merge ‘nuestro’ es lo que está actualmente en el directorio de trabajo. pero por un git rebase (o git rebase -onto) el significado puede cambiarse.

    – GoZoner

    19 de septiembre de 2013 a las 16:13

  • git stash , git pull , git stash apply Puedes soltar el alijo con: git stash drop Una vez que combine los cambios con éxito

    – SerSuman

    7 de diciembre de 2016 a las 7:41


  • Lo que pasa con git es que tienes que entender lo que va a hacer. La otra cosa con git es que incluso para las personas inteligentes, a menudo es muy difícil entender lo que va a hacer git.

    –Bradley Thomas

    6 de enero de 2017 a las 16:07

  • Deberías comprobar si realmente hay algo que esconder. De lo contrario, mostraría cambios ocultos de una anterior git stash.

    – Jörn Reimerdes

    30 de agosto de 2018 a las 10:29

yo suelo

git pull -X ours

lo que indicará a git que use la versión local al fusionarse.

  • Tenga en cuenta que la pregunta se mejoró para aclarar que se trataba de “cambios no confirmados”. Entonces, esta respuesta con cambios no confirmados causará: error: no se puede extraer con rebase: su índice contiene cambios no confirmados. error: por favor confírmalos o guárdalos.

    –Valerio Bozz

    hace 2 días

  • Muy buen punto.

    – Peter Algodón

    ayer

Si tiene un archivo en su repositorio que se supone que debe ser personalizado por la mayoría de los extractores, cambie el nombre del archivo a algo como config.php.template y añadir config.php para usted .gitignore.

  • revisa esta respuesta también, puedes usar .gitattributes para mantener siempre los cambios durante la fusión.

    – KurzedMetal

    2 de mayo de 2012 a las 13:43

  • Eso es más como lo que necesitaba. Lo de la plantilla es la solución elegante, pero me temo que no puedo usar esto ya que solo estoy escribiendo scripts de implementación.

    – Johnny Everson

    2 de mayo de 2012 a las 13:47

Avatar de usuario de Mark Longair
marca longair

Actualización: esto responde literalmente a la pregunta formulada, pero creo que la respuesta de KurzedMetal es realmente lo que quieres.

Asumiendo que:

  1. estas en la rama master
  2. La rama aguas arriba es master en origin
  3. No tienes cambios sin confirmar

…. Podrías hacerlo:

# Do a pull as usual, but don't commit the result:
git pull --no-commit

# Overwrite config/config.php with the version that was there before the merge
# and also stage that version:
git checkout HEAD config/config.php

# Create the commit:
git commit -F .git/MERGE_MSG

Puede crear un alias para eso si necesita hacerlo con frecuencia. Tenga en cuenta que si tiene cambios no confirmados en config/config.phpesto los tiraría.

También podemos probar git pull con rebase

git pull --rebase origin dev

  • Tenga en cuenta que la pregunta se mejoró para aclarar que se trataba de “cambios no confirmados”. Entonces, esta respuesta con cambios no confirmados causará: error: no se puede extraer con rebase: su índice contiene cambios no confirmados. error: por favor confírmalos o guárdalos.

    –Valerio Bozz

    hace 2 días

Avatar de usuario de Valerio Bozz
Valerio Boz

En caso de que haya cambios locales no confirmados, para evitar conflictos de fusión al extraer:

git stash save
git pull
git stash pop

Fuente:

https://git-scm.com/docs/git-stash

  • Tenga en cuenta que la pregunta se mejoró para aclarar que se trataba de “cambios no confirmados”. Entonces, esta respuesta con cambios no confirmados causará: error: no se puede extraer con rebase: su índice contiene cambios no confirmados. error: por favor confírmalos o guárdalos.

    –Valerio Bozz

    hace 2 días

Para responder a la pregunta: si desea excluir ciertos archivos de un pago, puede usar pago disperso

  1. En .git/info/sparse-checkout, defina lo que desea conservar. Aquí, queremos todo

    pero (tenga en cuenta el signo de exclamación) config.php :

  2. /* !/config.php

    Dile a git que quieres tener en cuenta el pago disperso

  3. git config core.sparseCheckout verdadero

    Si ya tiene este archivo localmente, haga lo que hace git en un pago escaso (dígale que debe excluir este archivo configurando el indicador “skip-worktree” en él)

  4. git update-index –skip-worktree config.php


Disfrute de un repositorio donde su archivo config.php es suyo, independientemente de los cambios que haya en el repositorio.

  • Tenga en cuenta que los valores de configuración NO DEBEN estar en el control de fuente:
  • Es una posible brecha de seguridad.

Provoca problemas como este para la implementación.

Esto significa que DEBE excluirlos (colocarlos en .gitignore antes de la primera confirmación) y crear el archivo apropiado en cada instancia en la que revisa su aplicación (copiando y adaptando un archivo de “plantilla”)

Tenga en cuenta que, una vez que git se hace cargo de un archivo, .gitignore no tendrá ningún efecto.

  • Dado que, una vez que el archivo está bajo control de fuente, solo tiene dos opciones (): git filter-branchrebase todo su historial para eliminar el archivo (con

  • )

  • crea una confirmación que elimine el archivo. Es como pelear una batalla perdida, pero bueno, a veces hay que vivir con eso. git read-tree and other merge-based commands (git merge, git checkout…​) can help maintaining the skip-worktree bitmap and working directory update. $GIT_DIR/info/sparse-checkout is used to define the skip-worktree reference bitmap. When git read-tree needs to update the working directory, it resets the skip-worktree bit in the index based on this file, which uses the same syntax as .gitignore files. If an entry matches a pattern in this file, skip-worktree will not be set on that entry. Otherwise, skip-worktree will be set.

    esto funciona perfectamente! Cito el manual:

    -Onno Rouast

¿Ha sido útil esta solución?