Git repo roto? – Archivos rastreados a pesar de gitignore

Tengo este directory:

/thumbs 

Dentro de este directory tengo un file .gitignore con este dentro:

 #remove everything * #except this: !.gitignore 

Si agrego un file de image en este directory, y lo hago:

 git status 

El file de image aparece como no rastreado.

¿Que debería hacer?

Tenga en count lo siguiente:

Dentro de ese directory, he hecho:

 git rm -r --cached . git add . git commit -m "gitignore SHOULD work" 

He eliminado cualquier espacio en blanco inferior adicional en el file .gitignore solo para estar seguro.

Aún así, si agrego el file, aparece como no rastreado.

¿Por qué?

¿Qué puedo hacer para ver dónde está el problema?

Actualización: en esta carpeta:

/user_uploaded_file que es una carpeta PARENT de /thumbs Tengo el siguiente gitignore:

 #ignore everything * #except: !.gitignore !/thumbs 

Hecho curioso:

SI, elimino la instrucción !/thumbs Thumbs de este gitignore dentro del padre, git ls-files que hacemos adentro !/thumbs .gitignore solo considera el .gitignore , como debería. Y podemos agregar, cambiar o borrar libremente files de image que a Git no le importa.

Sin embargo, si colocamos esa línea !/thumbs Thumbs dentro del gitignore en la carpeta principal, se enumeran las imágenes como no rastreadas.

ACTUALIZACIÓN 2

Curioso hecho II:

Si, en el file gitignore de la carpeta PARENT, hacemos lo siguiente:

SEGUNDO)

 * !.gitignore !/thumbs/.gitignore 

En lugar de:

UN)

 * !.gitignore !/thumbs/ 

Parece funcionar. Quiero decir, si agregamos cambiar o eliminar files dentro de /thumbs , git los ignorará correctamente.

Sin embargo, aunque esto funciona en este repository local específico, en mi propio repository, por ejemplo, no necesito nada de esto, y A) funciona.

: s

Solutions Collecting From Web of "Git repo roto? – Archivos rastreados a pesar de gitignore"

Primero debes agregar y enviar el file .gitignore para que gitignore ignore el file.

Si el (los) file (s) en cuestión se han confirmado previamente, deberá git rm [filename] para eliminarlo. Una vez hecho esto, si se agrega a su gitignore (y el .gitignore se agrega y confirma) se ignorará.

Algo no tiene sentido aquí

Considere las siguientes acciones:

 $ mkdir -p /tmp/example $ cd /tmp/example $ git init . $ mkdir -p user_uploaded_file/thumbs $ echo "some noise" > user_uploaded_file/thumbs/somefile $ git add user_uploaded_file/thumbs/somefile $ git commit -m "simulate initial dirty state" $ vim user_uploaded_file/.gitignore $ vim user_uploaded_file/thumb/.gitignore $ git add user_uploaded_file/.gitignore user_uploaded_file/thumbs/.gitignore $ git commit -m "add ignore files from the question" $ echo "some noise" > user_uploaded_file/thumbs/someotherfile 

Verificando el estado actual:

 $ git status # On branch master nothing to commit (working directory clean) $ git status --ignonetworking # On branch master # Ignonetworking files: # (use "git add -f <file>..." to include in what will be committed) # # user_uploaded_file/thumbs/someotherfile 

Tenga en count que nada se incluye en la list para comprometerse, y usar el indicador --ignonetworking muestra qué files se ignoran.

El file thumbs / .gitignore se está eliminando

Lo he hecho: git rm -r – cached.

Eso no está haciendo exactamente lo que quieres, aunque no es un factor en la pregunta:

 $ cd user_uploaded_file/thumbs $ git rm -r --cached . $ rm 'user_uploaded_file/thumbs/.gitignore' $ rm 'user_uploaded_file/thumbs/somefile' 

Está borrando los files no deseados, pero también está eliminando el file de ignorar git, que se puede deshacer de manera selectiva con:

 $ git reset HEAD .gitignore $ git status # On branch master # Changes to be committed: # (use "git reset HEAD <file>..." to unstage) # # deleted: user_uploaded_file/thumbs/somefile # 

Tenga en count que el file .gitignore no se muestra como eliminado ahora.

Soluciones

En lugar de enfocarte en lo que has hecho, veamos cómo resolver el problema. Según entiendo la pregunta, el problema es que ha cometido un ruido en el repository y desea eliminarlo.

Limpiar una installation

Para limpiar una salida, todo lo que se requiere es eliminar los files y confirmar:

 $ git ls-files user_uploaded_file/thumbs/ user_uploaded_file/thumbs/.gitignore user_uploaded_file/thumbs/somefile $ git status --ignonetworking # On branch master # Ignonetworking files: # (use "git add -f <file>..." to include in what will be committed) # # user_uploaded_file/thumbs/someotherfile $ git rm -r --cached user_uploaded_file/thumbs/ rm 'user_uploaded_file/thumbs/.gitignore' rm 'user_uploaded_file/thumbs/somefile' $ git reset HEAD user_uploaded_file/thumbs/.gitignore $ git status # On branch master # Changes to be committed: # (use "git reset HEAD <file>..." to unstage) # # deleted: user_uploaded_file/thumbs/somefile # $ git status --ignonetworking # On branch master # Changes to be committed: # (use "git reset HEAD <file>..." to unstage) # # deleted: user_uploaded_file/thumbs/somefile # # Ignonetworking files: # (use "git add -f <file>..." to include in what will be committed) # # user_uploaded_file/thumbs/somefile # user_uploaded_file/thumbs/someotherfile # $ git commit -m "deleting thumb files" 

Esto elimina los files (aunque seguirán existiendo en el repository hinchándolo) y luego empuja hacia el control remoto

 $ git pull $ git push ... 

Compruebe en qué se compromete este process de pago local:

 $ git branch -v * master f216a83 deleting thumb files 

Limpiar otras instalaciones

En todas las demás entregas del mismo repository, el único paso necesario para eliminar estos files de pulgar ya rastreados es:

 $ git pull remote: Counting objects: 7, done. remote: Compressing objects: 100% (2/2), done. remote: Total 4 (delta 0), reused 0 (delta 0) Unpacking objects: 100% (4/4), done. From /tmp/exmaple2/../example 41ec014..f216a83 master -> origin/master First, rewinding head to replay your work on top of it... Fast-forwarded master to f216a83940be0e60d560b27a882b9abca46ea383. $ git branch -v * master f216a83 deleting thumb files $ git ls-files user_uploaded_file/thumbs user_uploaded_file/thumbs/.gitignore $ git status # On branch master nothing to commit (working directory clean) $ ls -la user_uploaded_file/thumbs/ total 16 drwxrwxr-x 2 www-data www-data 4096 May 13 13:51 . drwxrwxr-x 3 www-data www-data 4096 May 13 13:30 .. -rw-rw-r-- 1 www-data www-data 48 May 13 13:30 .gitignore -rw-rw-r-- 1 www-data www-data 4 May 13 13:49 morefiles 

Tenga en count que esto solo eliminará los files que fueron rastreados previamente.

Si la otra installation está en una sucursal diferente, los cambios necesarios deben combinarse o no, ya que no están en ese historial de sucursales.

Si la otra installation está en la misma bifurcación pero con una confirmación diferente, entonces tiene confirmaciones locales: deberá verificar por qué eso es así o si las confirmaciones locales afectan el problema o no.

Los files de ignorar git son demasiado complejos

El contenido de los files git ignore existentes no es realmente necesario, pueden ser así de simples:

 $ cd /tmp/example $ echo "*" > user_uploaded_file/.gitignore $ echo "*" > user_uploaded_file/thumbs/.gitignore $ git commit -m "ignore everything in the user_uploaded_file folder" 

El file user_uploaded_file/thumbs/.gitignore realidad no sirve para ignorar el propósito, si solo es para asegurar que la carpeta exista, de hecho podría usar un file vacío y user_uploaded_file/thumbs/.gitignore un nombre .