2009-08-08 10 views
50

Estoy tratando de actualizar mi repositorio desde una sucursal remota y sigo recibiendo este error cuando hago un "git pull". No hice ningún cambio local, y aunque lo tenga, no es necesario que los guarde.Git pull: error: Entrada foo no actualizada. No se puede combinar

He intentado:

git reset --hard

y consigo el mismo problema

Lo único que parece funcionar es borrar el archivo infractor y probar un nuevo git pull .

También probé "git stash" seguido de "git pull". No vayas.

editar: utilizando PortableGit-1.6.4-preview20090729 por lo que cualquier error anterior con errores espurios debe ser reparado.

+0

Ver si la explicación en http://git.or.cz/gitwiki/GitFaq ayuda. –

+0

Ditto "* Lo único que parece funcionar es eliminar el archivo ofensivo y probar de nuevo una extracción de git. *". Para mí, al menos un archivo no estaba en git; fue ignorado por una regla comodín. Sin embargo, no estoy seguro de por qué fueron bloqueadores. – ruffin

Respuesta

15

En general, esto significa que tiene cambios en sus archivos locales que no han sido enviados a su repositorio local. También puede ver este stackoverflow question para un poco más de detalle.

+1

De la pregunta: _ "No he hecho ningún cambio local ..." _ –

1

Vale la pena probarlo:

pudo establecer que, sólo por esta actualización, establezca la config parameter core.trustctime a falso?

core.trustctime 

If false, the ctime differences between the index and the working copy are ignored; useful when the inode change time is regularly modified by something outside Git (file system crawlers and some backup systems).

+0

buen hallazgo, esto realmente funcionó para mí cuando vi el mensaje de error anterior al ejecutar "git reset --merge". Cuando establecí este parámetro en falso, eliminó el error. – DemitryT

53

Hay un par de maneras de solucionar esto, pero he encontrado escondite Git funciona bien para mí. Es temporal coloca tus cambios locales en otro lugar. Luego puede tirar, para agarrar los últimos cambios. Y luego puede recuperar sus cambios locales.

Al igual que este:

$ git pull 
... 
... 
file your_file.rb not up to date, cannot merge. 

$ git stash 
$ git pull 
$ git stash pop 
+1

@yuit: Si esto lo resolvió para usted, debe aceptar esta respuesta – kynan

+9

De la pregunta original: _ "También he intentado" git stash "seguido de un" git pull ". No vaya." _ –

20

Este tipo de problema es causada frecuentemente por tratar de tirar de un repositorio que tiene dos nombres de archivo que se diferencian sólo en el caso. Si está en FAT, NTFS en modo insensible a mayúsculas y minúsculas (esencialmente, cada vez que se usa en Windows) o HFS + en modo insensible a mayúsculas y minúsculas y tiene dos archivos "foobar" y "FOOBAR", entonces Git verá dos archivos, pero el sistema de archivos solo verá uno, lo que causará todo tipo de problemas. Git registrará, digamos, "FOOBAR", y luego presiona "foobar", que el sistema de archivos ve como simplemente reemplazar los contenidos de "FOOBAR" pero dejándolo en su lugar. Ahora, para Git, parece que "FOOBAR" ha sido reemplazado por el contenido de "foobar", y "foobar" se ha ido.

Existen dos manifestaciones diferentes de este problema básico. Una es cuando su repositorio en realidad contiene dos archivos que difieren solo en el caso. En este caso, debe trabajar en un sistema de archivos con distinción entre mayúsculas y minúsculas, o deberá editar el repositorio para asegurarse de que no se produzcan colisiones de este tipo; un sistema de archivos insensible a mayúsculas y minúsculas simplemente no puede almacenar el contenido de este repositorio.

Un caso diferente que puede solucionar es cuando ocurre un cambio de nombre que cambia el caso del archivo. Digamos, por ejemplo, que el repositorio de Git contiene un cambio de nombre de "EJEMPLO" a "ejemplo". Antes de que Git revise la nueva versión, intentará verificar que no sobrescriba algún archivo existente que tenga en su disco. Como cree que "ejemplo" es un nuevo nombre de archivo, preguntará al sistema de archivos si existe, y el sistema de archivos verá "EJEMPLO" y dirá que sí, por lo que Git se negará a verificar la nueva versión, ya que cree que se sobrescribirá. archivos sin seguimiento. En este caso, si no tiene cambios locales que le interesen, un simple git reset --hard <revision-to-checkout> generalmente será suficiente para superar el problema y la nueva revisión.Intente y recuerde no cambiar el nombre de los archivos a otros nombres que difieran solo en caso de que esté en un sistema de archivos que no distingue entre mayúsculas y minúsculas, ya que esto provocará problemas como este.

5

Podría ser un problema también con los permisos de archivos. Git también los está versionando, a menos que config indique lo contrario. Solo agregue esta respuesta para las personas que tienen casi un problema similar.

7

Para profundizar en la publicación de @Brian Campbell (porque el reinicio no funcionó tampoco), quiero señalar una caja de borde que me estaba deteniendo.

He movido un archivo OldFile a una carpeta diferente y lo he cambiado NewFile. Luego marqué el archivo como assume-unchanged.

Esto me impedía cambiar de rama y no había ningún escondite para guardar o comprometerme a presionar. El problema fue que no cometí este cambio de archivo con un nuevo nombre antes de configurar el indicador assume-unchanged. Así que lo configuré de nuevo en no-assume-unchanged, lo comprometí, luego lo configuré de nuevo en assume-unchanged y pude cambiar de nuevo sucursales.

+0

Esta respuesta puso yo en el camino correcto, gracias. Usé "git ls-files -v | grep"^[[: lower:]] '| awk' {print $ 2} '| xargs git update-index --no-assume-unchanged "para restablecer la bandera de asumir-sin cambios , entonces pude restablecer --hard sin errores. – ocroquette

+0

Creo que esto también se aplica a cualquier archivo marcado como 'asumir-sin cambios', tuve el mismo problema al ignorar los cambios en un archivo local que tenía su nombre original.Tu comentario me recordó que había marcado ese archivo, ¡gracias! –

+2

Tengo el mismo problema. Básicamente, "asumir sin cambios" es una característica malvada. Una vez que lo use, es MUY difícil sacar otras ramas. Incluso si usa 'checkout -f', fallará. –

2

Estaba viendo un problema similar (Windows 10): estaba en branchA y quería ir al master. Tuve algunos cambios sin compromiso así que primero I git stash luego git checkout -f master pero todavía tengo el Entry 'fileName' not uptodate. Cannot merge.

git status no mostró nada para confirmar.

Eventualmente acabo de eliminar el archivo manualmente y pude ir a la otra rama (que por supuesto hizo que mi archivo vuelva) así que supongo que ha habido un error dentro de git en alguna parte.

+0

Esta es la única solución a esta pregunta que funcionó para mí. ¡Estaba obteniendo el error con el archivo '.gitignore'! Aunque no le hice ningún cambio, y git no me permitió "esconderlo" (porque no hay cambios locales, ¡duh!). Así que moví el archivo '.gitignore' fuera del repositorio (como una especie de" copia de seguridad ") y luego hice un' git reset --hard', que "arregló" el repositorio en un estado sano. –

1

Esto puede suceder si se actualiza el índice de ignorar ciertos archivos:

git update-index --assume-unchanged <file> 

y luego, por ejemplo, la caja otra rama:

git checkout <branch> 
> error: Entry '<file>' not uptodate. Cannot merge. 

Forzar actualización de índice corrige el problema:

git update-index --really-refresh 
<file>: needs update 

Seguido por:

git reset --hard 

Y todo debería volver a la normalidad.

Cuestiones relacionadas