2012-01-12 31 views
5

Estoy usando Git solo para mi proyecto de software local en Visual Studio 2010. Recientemente creé una nueva rama para hacer una refacturación más grande de una de las ventanas de diálogo . Hice las siguientes modificaciones:Error de Git no resuelto: los siguientes archivos de árbol de trabajo sin seguimiento se sobrescribirán con el pago

  • cambiar el nombre de Form1 para Form1a (incluyendo todos los archivos en función
  • )
  • Añadir nuevo Form1

he comprobado este cambio en la rama, digamos forma refactorización. Curiosamente, Git no se dio cuenta de que renombré el archivo Form1.cs en Form1a.cs y creé un Form1.cs totalmente nuevo y totalmente diferente, pero noté un nuevo archivo Form1a.cs y encontré muchas diferencias entre los archivos Form1.cs anteriores y nuevos. Esto conducirá, por supuesto, a diffs totalmente guarnecidos, pero no me importa en este caso, siempre y cuando todos los archivos se manejen correctamente al final.

Luego cambié de nuevo a maestro para hacer algunos otros pequeños cambios. Nada en conflicto. Hasta ahora, todo funcionó bien.

Hoy, quería volver a la forma de refactorización de mi sucursal para continuar ese trabajo. Pero todo lo que obtengo es el siguiente mensaje:

git.exe checkout form-refactoring 

Aborting 
error: The following untracked working tree files would be overwritten by checkout: 
Form1.Designer.cs 
Please move or remove them before you can switch branches. 

¿Qué se supone que es? El archivo mencionado no está sin seguimiento. Ni en la rama principal, ni en la rama de refactorización de formularios. Es parte de ambas ramas, pero una no es descendiente de la otra. ¿Qué pasaría si lo borro, se ha ido para siempre? No confío en que Git me devuelva el archivo correcto si borro algo ahora. No jugué con ningún archivo fuera de las operaciones mencionadas de Git, entonces ¿por qué debería jugar con cualquier archivo para continuar usando las operaciones de Git ahora? ¡Git lo rompió, se supone que Git debe manejarlo ahora!

En este momento, no puedo continuar con mi trabajo porque no puedo cambiar de rama. ¿Hay una solución fácil para esto?

La versión de Git es 1.7.6, TortoiseGit es 1.7.3.

+0

qué te sucede que tiene un patrón que coincida con Form1.Designer.cs en su .gitignore o cualquier otro ignorar las configuraciones? – James

+0

Ese archivo tiene una marca verde en el Explorador y también tiene un historial. Entonces supongo que no es ignorado. Además, hay otros archivos Form.Designer.cs en mi proyecto que no causan ningún problema. Y este no es el primer repositorio de Git que creé con VS2010, hasta hoy, incluso algunos esfuerzos en la ramificación funcionaron bien. – ygoe

+0

Comprueba dos veces tus filtros de ignorar para ver si cambiaron para ese repositorio o rama. Todavía puede ver el estado y el historial en un archivo si se agregó antes del filtro de ignorar.Cualquier cosa que use el estado de git lo reportará (como las marcas de verificación del explorador). Esto puede causar el error que está indicando si realmente hay cambios en el archivo porque Git lo ignorará cuando ejecute el estado de Git. Sin embargo, Git aún sabrá que cambió al intentar hacer un pago y le dará ese error. – James

Respuesta

17

La opción de configuración core.ignorecase no se configuró y Visual Studio cambió el nombre del archivo .Designer.cs en el caso, cambiando de un capital a una "D" inferior (o viceversa). Ese fue el problema al final. Me tomó un poco de separación de historial de archivos (eliminar y volver a agregar archivos) para resolver este error después de establecer la opción en verdadero. En realidad, la opción se estableció en una computadora, pero al clonar el repositorio, la configuración se perdió de alguna manera. Y luego el destino solo estaba esperando que VS cambiara el nombre de ese archivo para atraparme.

Así que en Windows, siempre hay que asegurarse de que estos dos valores son correctos después de cualquier operación de inicio/clon:

git config core.ignorecase true 
git config core.autocrlf false 

Algunas herramientas (TGIT, gitscc etc.) no parecen hacerlo derecho. Es absolutamente necesario para una operación normal en Windows, pero a Git no le importa si no están configurados correctamente y simplemente te permite tropezar con ellos sin decirte por qué. Es tanto mentir como útil en este asunto.

0

Git no permite cambiar de ramas si existe la posibilidad de pérdida de datos.

En general, es una buena idea realizar todos los cambios antes de cambiar a otra sucursal. Si no está absolutamente seguro de que usted no hizo que este cambio puede restablecer su árbol de trabajo utilizando

comando
git reset --hard HEAD 

. Pero no recomiendo hacer esto. Utilice

git stash 

comando para ocultar sus cambios en el almacenamiento interno. En este caso, siempre puedes recuperar tus datos.

+0

tengo ningún cambio ni comprometer en este momento. Cometí todo antes de cambiar a la rama principal y también he comprometido todo en este momento, pero no puedo cambiar a ninguna parte. La acción de compromiso dice que no tengo cambios no confirmados. ¿Su respuesta todavía se aplica? – ygoe

+0

@LonelyPixel su comentario es confuso. git dice que hay algunos cambios. De todos modos, git stash no hace nada en un directorio de trabajo limpio. Entonces es seguro experimentar –

+0

¿Cómo es confuso? Stash dice: éxito de Stash: no hay cambios locales para guardar. – ygoe

0

Parece que la rama XXX (refactorización de formularios) contiene este archivo pero YYY no. Y ahora estás tratando de pasar de la rama YYY a XXX. Git teme que te olvides de agregar el archivo para que no se pueda mover a otra.

Uso

git status 

para determinar si éste (Form1.Designer.cs) es sin seguimiento.En este caso, solo confírmelo y luego puede pasar con seguridad a otra sucursal

+0

Como comenté en la otra respuesta, no hay cambios no confirmados y ese archivo realmente no se ha desmarcado. No puedo hacer nada para limpiar mi directorio de trabajo. – ygoe

+0

git clean -f -d limpia tu árbol de trabajo. –

+0

Eso no ayuda. – ygoe

0

En primer lugar, Git no le está mintiendo. El archivo realmente se rastrea en la rama, y ​​realmente existe en el árbol de trabajo, y realmente no se rastrea.

Dado que usted sugiere en otros comentarios que el archivo no aparece en diffs o incluso en git status, parece que lo ha agregado a su gitignore (quizás de forma involuntaria mediante un patrón comodín). Sé que dijiste que no, pero si no aparece en el resultado de git status como un archivo sin seguimiento, no se rastrea ni se ignora. Para comprobar esto, puede listar todos los archivos ignorados por .gitignore:

git ls-files -i --exclude-from=.gitignore 

También puede enumerar todos los archivos sin seguimiento, ignoran o no:

git clean -xdn 

(Se parecen decir que eres muy Asegúrese de que el archivo esté rastreado, si realmente fuera así, git show HEAD:path/to/file mostraría los contenidos comprometidos del archivo. Sin embargo, sospecho que eso indicará que "fatal: Ruta de acceso/ruta/archivo" no existe en "HEAD". .)

Otra forma de verificar que el archivo no se rastree e ignore es simplemente r ename it, luego vea si git status lo informa como eliminado; si no lo hace, no fue rastreado.

Suponiendo que esto no enumera el archivo en cuestión, debe examinar el archivo en su árbol de trabajo. Puede ver qué versión del archivo tiene la otra rama usando git show other-branch:path/to/file, para comparar. Si está satisfecho de que no necesita la versión en su árbol de trabajo, simplemente quítela. Si le preocupa que pueda necesitarlo, cámbiele el nombre o muévalo fuera del directorio. Si se da cuenta de que lo necesita, debe averiguar qué patrón ignorar lo está ignorando, eliminarlo, agregarlo y comprometerlo. En cualquier caso, una vez que haya tratado el archivo, podrá cambiar de sucursales.

+0

'git ls-files -i --exclude-from = .gitignore' no muestra nada. El uso de la ruta relativa real a .gitignore muestra "fatal: no se puede usar ... \. Gitignore como un archivo de exclusión". 'git show HEAD: ruta/a/archivo' me muestra el contenido esperado de ese archivo. Entonces realmente está registrado. Renombrando el archivo, 'estado de git' informa el archivo eliminado y un nuevo archivo sin seguimiento. Git también me mostrará el mismo archivo de la otra rama, pero como esos archivos son generados por el diseñador VS, no puedo compararlos con mi ojo. - Entonces, ¿puedo afirmar con seguridad que Git realmente me está mintiendo? – ygoe

+0

Bueno, entonces parece que algo se ha desbalanceado o dañado de alguna manera, si un clon del repositorio, con el árbol de trabajo idéntico al original, funciona normalmente. Es un poco difícil de creer, ya que esta es una parte central de Git bastante probada, pero si estás seguro de que es un error espurio, podrías reportarlo a la lista de correo de Git. – Cascabel

+0

Todavía está algo roto. :(yo podría comprometerse a mi nueva operación y volver a la rama principal, pero la fusión falla por la misma razón. Git cree que uno de los archivos que administra es sin seguimiento y se remplazará. Lo que esto significa. Me han informado que . a la lista de correo, pero no hay respuesta todavía Estrellarse un repositorio no parece ser demasiado interesante – ygoe

0

Esto resolvió el problema para mí rm .git/fs_cache

Cuestiones relacionadas