Tengo un repositorio CENTRAL que tiene tres repositorios de desarrolladores que lo empujan y lo empujan normalmente.
También tengo otros dos repositorios que extraen del repositorio central: uno es el servidor en vivo y el otro es un servidor de prueba / etapa, cada uno extrayendo de su propia rama respectiva.
El escenario es este: tengo un post-update
script de enlace en el repositorio CENTRAL que accede automáticamente a los repositorios de prueba y en vivo y ejecuta un comando de extracción en cada uno. Esto actualiza los servidores de prueba y en vivo, todo dependiendo de qué rama tiene nuevos commits. Todo esto funciona muy bien.
El problema es este: puede haber ocasiones en una emergencia en las que los archivos se actualicen directamente en el servidor (a través de ftp o lo que sea) y el script CENTRAL posterior a la actualización fallará, ya que se producirán conflictos de fusión / sobrescritura. No hay forma de evitar este escenario, y es inevitable.
Lo que me gustaría que sucediera es esto: quiero que la extracción de los sitios en vivo y de prueba siempre sobrescriba / combine en la extracción. Siempre. Estos repositorios serán solo de extracción ya que no son para el desarrollo.
En toda mi investigación, no puedo encontrar una buena solución para que una extracción siempre fuerce una sobrescritura de los archivos locales. ¿Es esto posible? Sería un gran escenario de desarrollo si es así.
Respuestas:
Realmente la forma ideal de hacer esto es no usar
pull
en absoluto, pero en su lugarfetch
yreset
:(Alterando
master
cualquier rama que quiera seguir).pull
está diseñado para fusionar cambios de alguna manera, mientras quereset
está diseñado simplemente para hacer que su copia local coincida con una confirmación específica.Es posible que desee considerar opciones ligeramente diferentes
clean
según las necesidades de su sistema.fuente
reset --hard
es un comando que se utiliza para forzar el estado del directorio de trabajo (y la rama actual) a un estado que coincida con el de un commit particular.FETCH_HEAD
es una referencia que se crea automáticamentefetch
para representar la referencia obtenida. No se fusiona, solo se sobrescribe directamente cada vez que realiza una búsqueda.clean
es un comando que elimina archivos que no son rastreadosgit
, los-df
indicadores le dicen que elimine directorios (-d
) y que realmente elimine (-f
).git clean -dn
antes de usargit clean -df
para ver qué archivos / carpetas se eliminarán.git clean -df
solo se puede revertir si tenía una copia de seguridadgit clean -df
también elimine los archivos ignorados, pero resulta que no lo hará.git clean --help
dice "Normalmente, solo se eliminan los archivos desconocidos para Git, pero si se especifica la opción -x, también se eliminan los archivos ignorados. Esto puede, por ejemplo, ser útil para eliminar todos los productos de compilación".Podrías probar esto:
(de ¿Cómo fuerzo "git pull" para sobrescribir los archivos locales? )
Otra idea sería eliminar todo el git y hacer un nuevo clon.
fuente
No estoy seguro de cómo hacerlo con un comando, pero podría hacer algo como:
o incluso
fuente
git reset --hard && git pull
. Alternativamente, pero no mejorgit reset --hard; git pull
,. El uso&&
solo ejecutará el segundo comando si el primer comando fue exitoso.;
lo ejecutará independientemente del código de salida del primer comando.Para extraer una copia de la rama y forzar la sobrescritura de archivos locales desde el origen, use:
Todo el trabajo actual se perderá y será igual a la rama de origen.
fuente
fuente
Puede cambiar el gancho para limpiar todo.
fuente
git clean
ya es "Eliminar archivos no rastreados del árbol de trabajo" (parte superior de la página). Normalmente, esto no incluye los archivos ignorada, pero-x
dicegit clean
que incluya ficheros ignorados, así (salvo esto no afecta a los archivos ignorados por la-e
opción).Si aún no ha confirmado los cambios locales desde la última extracción / clonación, puede usar:
checkout
borrará sus cambios locales con el último commit local ypull
lo sincronizará con el repositorio remotofuente