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
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 ungit rebase
(ogit 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
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:
- estas en la rama
master
- La rama aguas arriba es
master
enorigin
- 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.php
esto 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
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:
-
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
-
En
.git/info/sparse-checkout
, defina lo que desea conservar. Aquí, queremos todopero (tenga en cuenta el signo de exclamación) config.php :
-
/* !/config.php
Dile a git que quieres tener en cuenta el pago disperso
-
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)
-
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-branch
rebase 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
¿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