.gitignore y "Los siguientes archivos de árbol de trabajo sin seguimiento se sobrescribirán al finalizar la compra"

828

Entonces agregué una carpeta a mi archivo .gitignore.

Una vez que hago un git statusme dice

# On branch latest
nothing to commit (working directory clean)

Sin embargo, cuando trato de cambiar las ramas me sale lo siguiente:

My-MacBook-Pro:webapp marcamillion$ git checkout develop
error: The following untracked working tree files would be overwritten by checkout:
    public/system/images/9/thumb/red-stripe.jpg
    public/system/images/9/original/red-stripe.jpg
    public/system/images/8/thumb/red-stripe-red.jpg
    public/system/images/8/original/red-stripe-red.jpg
    public/system/images/8/original/00-louis_c.k.-chewed_up-cover-2008.jpg
    public/system/images/7/thumb/red-stripe-dark.jpg
    public/system/images/7/original/red-stripe-dark.jpg
    public/system/images/7/original/DSC07833.JPG
    public/system/images/6/thumb/red-stripe-bw.jpg
    public/system/images/6/original/website-logo.png
    public/system/images/6/original/red-stripe-bw.jpg
    public/system/images/5/thumb/Guy_Waving_Jamaican_Flag.jpg
    public/system/images/5/original/logocompv-colored-squares-100px.png
    public/system/images/5/original/Guy_Waving_Jamaican_Flag.jpg
    public/system/images/4/thumb/DSC_0001.JPG
    public/system/images/4/original/logo.png
    public/system/images/4/original/DSC_0001.JPG
    public/system/images/4/original/2-up.jpg
    public/system/images/3/thumb/logo2.gif
    public/system/images/3/original/logo2.gif
    public/system/images/3/original/Guy_Waving_Jamaican_Flag.jpg
    public/system/images/3/original/11002000962.jpg
    public/system/images/2/thumb/Profile Pic.jpg
    public/system/images/2/original/Profile Pic.jpg
    public/system/images/2/original/02 Login Screen.jpg
    public/system/images/1/original/Argentina-2010-World-Cup.jpg
Please move or remove them before you can switch branches.
Aborting

Así es como se ve mi archivo .gitignore:

.bundle
.DS_Store
db/*.sqlite3
log/*.log
tmp/**/*
public/system/images/*
public/system/avatars/*

¿Cómo hago que esto funcione para poder cambiar de sucursal sin eliminar esos archivos?

Si hago un cambio, ¿afectará esos archivos? En otras palabras, si volviera a esta rama después, ¿todo sería perfecto hasta mi último compromiso?

No quiero perder esos archivos, simplemente no quiero rastrearlos.

marcamillion
fuente
10
si realmente no te interesan estos archivos: git checkout -f <branch> en mi caso, los archivos se generan en el proceso de compilación, por lo que no me importaría menos
Hobbamok
A veces sucede si haces 'git checkout' (sin un nombre de sucursal). Para solucionarlo, haga 'git checkout branchname'
crafter
Pregunta separada, pero críticamente relacionada: ¿por qué ocurre este error? ¿por qué git no puede cambiar entre ramas?
ahnbizcad
@ahnbizcad Debido a que si estaba trabajando en un nuevo archivo y alguien en otra rama cometió un archivo con el mismo nombre, se enojaría si Git tiraba a la basura su versión cuando cambiaba de rama. Es por eso que la bandera -f está ahí.
Matthew Sharp

Respuestas:

264

Parece que desea ignorar los archivos, pero ya se han confirmado. .gitignore no tiene ningún efecto en los archivos que ya están en el repositorio, por lo que deben eliminarse con git rm --cached. Esto --cachedevitará que tenga algún efecto en su copia de trabajo y se marcará como eliminado la próxima vez que confirme. Después de eliminar los archivos del repositorio, el .gitignore evitará que se vuelvan a agregar.

Pero tiene otro problema con su .gitignore, está utilizando excesivamente comodines y está haciendo que coincida menos de lo que espera. En cambio, cambiemos el .gitignore e intentemos esto.

.bundle
.DS_Store
db/*.sqlite3
log/*.log
tmp/
public/system/images/
public/system/avatars/
Arrowmaster
fuente
2
Gracias ... Eliminé todos los archivos de la rama actual y los hice una copia de seguridad. Luego cambian ramas y las vuelven a poner. Eso funciono. Además, gracias por el consejo sobre el .gitignore aunque
marcamillion
@marcamillion: ¿Qué quieres decir con "eso funcionó"? Si los archivos fueron rastreados en la rama de cambiar al, que los haya sobrescrito con sus versiones, lo que podría ser diferente ...
Cascabel
1
Estaba teniendo un problema con una carpeta / build que no necesita ser rastreado. Así que eliminé la carpeta local, confié mi archivo .gitignore y luego revisé la otra rama. Eso finalmente funcionó para mí.
Mike S.
16
Creo que la primera parte es para el reverso de este mensaje de error en particular. Este error indica que el usuario se encuentra actualmente en una rama que no tiene esos archivos JPG rastreados y que el usuario está intentando pasar a uno que sí los tenga. Hacerlo git rm --cachedno hará una diferencia, esos archivos no existen en la rama actual. Para este error, creo que el usuario debe seguir la respuesta de @Greg Hewgill: "sacarlos de la copia de trabajo, cambiar de rama y volver a moverlos".
studgeek
55
¿Cómo se podría ir sobre la solución del your files would be overwrittencon fatal: pathspec 'test/node_modules' did not match any filescuando lo haga git rm -r --cache test/node_modules? No puedo tirar por el mensaje sobrescrito y no puedo eliminarlo porque git no puede encontrarlos (están allí)
HMR
1047

ADVERTENCIA: eliminará los archivos no rastreados, por lo que no es una gran respuesta a la pregunta que se plantea.

Llegué a este mensaje también. En mi caso, no quería conservar los archivos, así que esto funcionó para mí:

git 2.11 y más reciente

git clean  -d  -f .

git mayor

git clean  -d  -f ""

Si también desea eliminar archivos ignorados por git, ejecute el siguiente comando.

Ten cuidado !!! ESTO PROBABLEMENTE DESTRUYE SU PROYECTO, UTILICE SOLO SI SABE EL 100% DE LO QUE ESTÁ HACIENDO

git 2.11 y más reciente

git clean  -d  -fx .

git mayor

git clean  -d  -fx ""

http://www.kernel.org/pub/software/scm/git/docs/git-clean.html

  • -x significa que los archivos ignorados también se eliminan, así como los archivos desconocidos para git.

  • -d significa eliminar directorios no rastreados además de archivos no rastreados.

  • -f se requiere para forzarlo a correr.

Scott Schafer
fuente
77
Gracias, después de esa limpieza pude hacer una nueva versión;
Alexander Beletsky
139
Tenga cuidado al correr git clean!
Noel
249
Para evitar un facepalm, primero ejecútelo con la opción de funcionamiento en seco para ver qué haría: git clean -dfxnogit clean -dfx --dry-run
Dennis
74
Santo cielo. Esto elimina todos los archivos de configuración en mi xcode y ahora el proyecto se está convirtiendo en proyecto mac. Tenga mucho cuidado al ejecutar este comando. Pensé que solo lo eliminaría de git.
tyegah123
25
La -xopción me duele
wener
589

Advertencia: esto eliminará los archivos locales que no están indexados

Solo forzarlo: git checkout -f another-branch

Régis
fuente
78
Advertencia: Esto eliminará los archivos locales que no están indexados.
givanse
git clean no funcionó para mí, pero la fuerza era exactamente lo que necesitaba. Estaba atascado en esa rama y solo lo necesitaba para cambiar de rama.
Simon The Cat
77
¡No quería el archivo que no estaba indexado! +1 para ti
ryansstack
recibí este error ,,, :(error: pathspec 'mybranch' did not match any file(s) known to git.
Budi Mulyo
2
Esta es la verdadera respuesta.
metamonkey
147

Si está en OS X, puede deberse a que el nombre de un archivo ha cambiado el carácter de ciertos caracteres. Intente configurar la siguiente opción de configuración:

git config core.ignorecase true
mattbasta
fuente
13
Se trabajó en Windows, así, parece que esta situación ocurrió en el primer lugar debido al cambio GIT caso, que no pudo determinar
SagiLow
44
Este es exactamente el problema que tuve, una ruta de archivo era diferente en mayúsculas y minúsculas: Windows trata esto igual pero GIT no sabe cuál es el problema.
Daniel Sokolowski
1
Mi problema ocurrió al pagar otra sucursal en Windows 10, y solo esto funcionó para mí, gracias
Weijie Sun
¡increíble! esto solucionó mi problema cuando me movía entre etiquetas
William Añez
1
Funciona también si lo intentas git rebasetambién. Gracias.
user3890355
42

Git te dice que quiere crear archivos (con nombre, public/system/images/9/...etc.), pero que ya tienes archivos existentes en ese directorio que Git no rastrea. ¿Quizás alguien más agregó esos archivos al repositorio de Git, y esta es la primera vez que cambias a esa rama?

Probablemente haya una razón por la cual esos archivos en su developrama pero no en su rama actual. Puede que tenga que preguntar a sus colaboradores por qué es eso.

¿Cómo puedo hacer que esto funcione para poder cambiar ramas sin eliminar esos archivos?

No puede hacerlo sin hacer que los archivos desaparezcan de alguna manera. Se podría cambiar el nombre publicde my_public, o algo por el momento.

si volviera a esta rama después, ¿todo sería perfecto hasta mi último compromiso?

Si confirma sus cambios, Git no los perderá. Si no confirma sus cambios, Git intentará realmente no sobrescribir el trabajo que ha realizado. Eso es lo que Git te advierte en primera instancia aquí (cuando intentaste cambiar de rama).

Greg Hewgill
fuente
Gracias por la explicación. Realicé una copia de seguridad de los archivos, cambié ramas y las fusioné, luego reemplacé los archivos en la carpeta pública. Eso funciono.
marcamillion
1
Como comenté en la respuesta de @ Arrowmaster. Esta es la respuesta correcta para el mensaje de error. Puede que no sea la respuesta correcta para este interrogador en particular, ya que los problemas reales parecen ser su gitignore.
studgeek
38

Esto funcionó para mí.

 1. git fetch --all
 2. git reset --hard origin/{branch_name}
Chamara Jayalath
fuente
55
Agregue una explicación sobre su solución. ver stackoverflow.com/help/how-to-answer
user7294900
Aquí está mi opinión. Su copia local de la rama remota en realidad tiene todos los archivos no rastreados, de alguna manera. Lo estás revisando para restaurar los archivos no rastreados de los que originalmente se quejó. Ahora puede cambiar a otras sucursales
ahnbizcad
2
Por alguna razón, esta es la única solución que funciona para mí. Gracias amigo.
Kiwad
Resuelto mi problema Gracias
Devashis Kant
Muchas gracias, tan simple! git reset: origen / desarrollo suave. Cómo odio la edición de estos conflictos de fusión. Este comando tan agradable y simple.
nine9five
22

Hay un comando para esta delicada tarea (eliminar permanentemente archivos no rastreados)

git clean -i

Entonces git pulllo haré.

Abhishek Goel
fuente
13

Para aquellos que necesitan algo de menos alcance que la respuesta de Scott Schafer ,

git clean -f

probablemente funcionará. Yo altamente sugiero correr

git clean --dry-run

primero. Ese comando generará una lista de archivos que Git eliminará si ejecuta git clean -f, y podría ahorrarle la molestia de eliminar inadvertidamente algo que no deseaba.

Consulte esta respuesta de Stack Oveflow o los documentos para obtener más información git clean.

mc_kaiser
fuente
12

Desafortunadamente, ni git rm --cachedo git clean -d -fx ""lo hizo por mí.

Mi solución terminó siendo empujar mi sucursal a control remoto, clonar un nuevo repositorio y luego fusionarme en el nuevo repositorio. Otras personas que accedieron al repositorio tuvieron que hacer lo mismo.

Moraleja de la historia: use un .gitignorearchivo desde el inicio.

Kyle Clegg
fuente
10

Si desea resolver rápidamente esta pregunta, puede usar este comando:

git checkout -f dev
GeekHades
fuente
Esto me ayudó cuando mi problema no estaba relacionado con .gitignoreafaik.
Nakilon
error: Pathpec 'dev' no coincide con ningún archivo conocido por git.
Negro
@ Black 'dev' es el nombre de la sucursal, pon tu sucursal en su lugar
Vinit Solanki
8

Tuve el mismo problema al registrarme en una sucursal en función de una confirmación anterior. Git se negó a pagar debido a los archivos no rastreados.

He encontrado una solución y espero que te ayude también.

Agregar los directorios afectados .gitignorey emitirlos $ git rm -r --cachedaparentemente no es suficiente.

Suponga que desea hacer una rama basada en un commit K anterior para probar algunas cosas y volver a la versión actual. Lo haría en los siguientes pasos:

  1. Configure los archivos no rastreados: edite .gitignorey aplique $ git rm -r --cacheden los archivos y directorios que desea que git ignore. Añadir también el archivo .gitignoreen sí a .gitignorey no se olvide de tema $ git rm -r --cached .gitignore. Esto asegurará que el comportamiento de ignorar de git deje lo mismo en los commits anteriores.

  2. Confirma los cambios que acabas de hacer:

    $ git add -A
    $ git commit

  3. Guarde el registro actual; de lo contrario, puede tener problemas para volver a la versión actual

    $ git log > ../git.log

  4. Hard reset a la confirmación K

    $ git reset --hard version_k

  5. Crear una rama basada en el commit K

    $ git branch commit_k_branch

  6. Pagar en esa rama

    $ git checkout commit_k_branch

  7. Haz tus cosas y compromételas

  8. Pago nuevamente en master nuevamente

    $ git checkout master

  9. Restablecer a la versión actual nuevamente

    $ git reset current_version o $ git reset ORIG_HEAD

  10. Ahora puede restablecer duro a la CABEZA

    git reset --hard HEAD

¡NOTA! No omita el penúltimo paso (p $ git reset --hard ORIG_HEAD . Ej ., Por ejemplo ), de lo contrario, los archivos no rastreados que git se quejó anteriormente se perderán.

También me aseguré de que los archivos de los que se quejaba git no se eliminaran. Los copié en un archivo de texto y emití el comando$ for i in $(cat ../test.txt); do ls -ahl $i; done

Si vuelve a pagar en la sucursal mencionada anteriormente, no olvide emitir $ git statuspara asegurarse de que no aparezcan cambios no deseados.

Juri Sinitson
fuente
8

Esto me pasó en un Windows 8 , usando Git desde el símbolo del sistema. El resto de mi equipo usa TFS , y yo uso el git-tf de Microsoft para empujar / tirar entre TFS y mi repositorio local de Git.

El problema surgió debido a algunos archivos habían sido renombrados solo para cambiar su caso . Lo que parece haber sucedido fue esto:

  • Los archivos se registraron con una carcasa mixta en sus nombres.
  • En una confirmación posterior, los nombres de los archivos se cambiaron a minúsculas.
  • git-tf inicialmente obtuvo los archivos en mayúsculas y minúsculas.
  • Cuando los archivos fueron renombrados a minúsculas, git-tf no obtuvo los archivos porque para Windows 8 esos nombres de archivos son equivalentes.
  • Dado que Git distingue entre mayúsculas y minúsculas, se quejó de que tenía los archivos de mayúsculas y minúsculas que no estaban en el control de origen. Pero usando git status, no pude ver ningún cambio, ya que en el símbolo del sistema de Windows esos nombres de archivo son equivalentes.

La solución más simple para mí fue:

  • git checkoutuna versión anterior del proyecto, mucho antes de que esos archivos fueran agregados .
  • Luego, git checkoutla última versión del proyecto, con la carcasa de archivo correcta.
Ryan Lundy
fuente
+1 Pude usar git log en la rama actual y en la rama para volver a crear una base para ver cuándo se produjo la confirmación que cambió el caso; entonces lo pirateé ...
sabio
4

Estas dos funciones (git rm --cached, git checkout -f another-branch) NO me funcionaron.

En cambio, eliminé físicamente el archivo (en eclipse) como lo que Git te dice que hagas; Mueva o elimínelos antes de poder cambiar de rama.

y luego lo agrego / lo comprometo.

y luego tiré y funcionó!

Choung joven
fuente
4

En mi caso, el problema fue con los submódulos. masterse fusionó con otra rama que agregó un nuevo submódulo al proyecto. La sucursal que estaba tratando de pagar no la tenía, por eso git se quejaba de los archivos no rastreados y ninguna de las otras soluciones sugeridas me funcionó. Forcé el pago a mi nueva sucursal y saqué al maestro.

  • git checkout -f my_branch
  • git pull origin master
  • git submodule update --init
Bruno Pinheiro
fuente
3

En mi caso git rm --cachedno funcionó. Pero lo tengo con ungit rebase

Hillkorn
fuente
3

También estaba enfrentando un problema similar y probé todas las soluciones publicadas anteriormente, pero no funcionó

El problema se debía cuando cambió el nombre a mi onMusicUpdateListener.javaa OnMusicUpdateListener.javaen developrama.

Ahora mastertenía onMusicUpdateListener.java y developtenía el mismo archivo queOnMusicUpdateListener.java

Ahora cada vez que cambié a maestro me dio un error

The following untracked working tree files would be overwritten by checkout

y entonces aborted.

Para resolver esto, bifurco con fuerza checked out mastery luego le cambié el nombre onMusicUpdateListener.javaa OnMusicUpdateListener.java, committedit y luego mergedcon developbranch.

Entonces i actualizado mi developrama por mergingen mastery ahora todo ha vuelto a la normalidad y problema está resuelto.

Sheraz Ahmad Khilji
fuente
Me he encontrado con problemas similares antes. Según tengo entendido, el problema de mayúsculas y minúsculas parece ser un problema solo en Windows. Supongo que estás desarrollando en Windows?
Ji_in_coding
2

Esto podría ser un problema de permiso,

cambiar la propiedad,

sudo chown -v -R usr-name:group-name folder-name
Won Jun Bae
fuente
También tuve el mismo problema que Won. Agregué un .gitignore a una carpeta que ya estaba siendo rastreada. Eliminé el archivo y luego pude hacer un pago git.
cbloss793
2

2 archivos con el mismo nombre pero diferente caso podría ser el problema.

Puede eliminar uno de estos archivos o cambiarle el nombre. Ex:

Pdf.html.twig (The GOOD one)

pdf.html.twig (The one I deleted)
Samuel Vicent
fuente
2

Mover archivos, en lugar de eliminar

Una forma de evitar eliminar archivos es moverlos en su lugar. Por ejemplo:

cd "`git rev-parse --show-toplevel`"
git checkout 2>&1 | while read f; do [ ! -e "$f" ] || mv "$f" "$f".bak; done
gmatht
fuente
1

Si ha cambiado el nombre de un archivo localmente y luego hace un pull, mostrará ese mensaje de error.

Lyuboslav Kanev
fuente
¿Cómo superar este error en ese caso? Este mensaje también aparece cuando se cambian las ramas después de cambiar el caso en un nombre de archivo (MyFile => myfile).
Bernhard Döbler
1

eso es fácil de resolver, git está diciendo que tiene los mismos archivos en ambas ramas, por lo tanto, debe eliminar los archivos específicos de la rama maestra y luego podrá fusionar:

git fusiona "tu rama"

Espero que funcione para ti, acabo de resolver mi error. mi error fue:

error: los siguientes archivos de árbol de trabajo no rastreados se sobrescribirán mediante la fusión: .vs / slnx.sqlite Mueva o elimínelos antes de fusionarlos. Abortar

¡Ahora está funcionando! En mi caso .vs / slnx.sqlite fue generado por Visual Studio, necesitaba cerrarlo antes de eliminarlo.

jeirueda
fuente
0

En mi caso, estaba viendo este error porque estoy usando un popular CMS de código abierto y el directorio que estaba causando problemas era el directorio de carga en el que escribe el CMS.

Entonces, lo que decía es que hay archivos que no tienes, pero que no puedes obtener de las versiones.

Estoy tomando todos los archivos del sitio en vivo a mi local, luego lo revisaré en el repositorio con la esperanza de que esto solucione el problema.

Markosaurus
fuente
0

Elimine el archivo .gitignore de appname / gen / para resolver este problema.

vishnuc156
fuente
0

Simplemente fui al sistema de archivos y eliminé el archivo directamente, luego continué con git checkout y funcionó.

He tenido el problema varias veces y puede estar relacionado con los desarrolladores que hacen eliminar, empujar, volver a agregar, empujar o algo por el estilo.

Phil Carter
fuente
0

La mayoría de las respuestas consideran eliminar o eliminar los archivos, que es la manera fácil. Pero a veces no quieres deshacerte de los archivos locales. Pero fusionarse con una estrategia, por lo que git también tiene solución para esto;

git merge --strategy=ours master 
Erdinç Çorbacı
fuente
0

Simplemente elimine los archivos o cámbieles el nombre.

p.ej

$ git pull
Enter passphrase for key '/c/Users/PC983/.ssh/id_rsa':
error: Your local changes to the following files would be overwritten by merge:
        ajax/productPrice.php
Please commit your changes or stash them before you merge.
error: The following untracked working tree files would be overwritten by merge:
        ajax/product.php
Please move or remove them before you merge.
Aborting
Updating a04cbe7a..6aa8ead5

Tuve que cambiar el nombre / eliminar ajax / product.php y ajax / produtPrice.php .

No te preocupes, git pull los traerá de vuelta. Le sugiero que los renombre en lugar de eliminarlos, porque podría perder algunos cambios.

Si esto no ayuda, entonces debe eliminar toda la Rama y crearla nuevamente y luego hacer git pull origin remotebranch

Negro
fuente
0

Para guardar los archivos modificados y usar el contenido modificado más adelante. Encontré este error al intentar verificar una rama y al intentar cambiar la base. Prueba Git stash

git stash

MöĦämëđ ÏbŗäĦïm
fuente
0

Compruebe si algún nombre de carpeta tiene '/' o algún símbolo especial y cambie el nombre de esas carpetas. Luego, simplemente clone el repositorio en otra ubicación.

Codemaker
fuente
0

Una solución simple podría ser: solo asegúrese de estar en el directorio de trabajo correcto GitBash. Ese mensaje aparece casi siempre si un usuario intenta fusionar un directorio demasiado alto en su jerarquía de carpetas.

Ejemplo:

/workspace/git/myBashSourceFolder/myProjectSourcefolder

Escenario: el repositorio clonado por el usuario git-foldercreó un nuevo proyecto Java en Eclipse e importó el repositorio clonado. Eclipse estableció myProjectSourceFolder como carpeta de origen en su proyecto local. por lo tanto, el Usuario lo ingresó en git bash y empujó, tiró y comprometió su proyecto desde allí. git se sincroniza por lo tanto myProjectSourceFolder, pero no tiene registro en su historial para myBashSourceFolder. Por lo tanto, un push / pull / merge de myBashSourceFolder producirá el resultado dado, si el Usuario intenta sincronizar desde allí la próxima vez, en lugar de la carpeta que trabajó antes.

Solución: ingrese la carpeta correcta e intente una extracción nuevamente. En casi todas las veces que me encontré, esta solución funcionó bien :)

mZed
fuente