¿Ignorar archivos modificados (pero no confirmados) en git?

182

¿Puedo decirle a git que ignore los archivos que se modifican (eliminan) pero que no deberían confirmarse?

La situación es que tengo un subdirectorio en el repositorio que contiene cosas que no me interesan en absoluto, así que lo eliminé para evitar que aparezca en autocompletados y similares (en el IDE).

Pero ahora, si agrego esa carpeta a .gitignore, simplemente nada cambia, todo se muestra como eliminado por el estado de git.

¿Hay alguna manera de hacer que git lo ignore de cualquier manera?

(Alternativamente, como estoy usando git-svn, ¿podría confirmar los cambios en el git local y asegurarme de que no se pasen al repositorio svn?)

Sam
fuente
en lugar de simplemente marcarlos como no modificados en el índice de repositorio, es posible que desee eliminarlos completamente del índice. Entonces, aunque todavía tendrá el archivo en su directorio de trabajo, el índice de repositorio puede eliminarse por completo, y git ni siquiera lo verá como si hubiera existido. Por favor vea el enlace en mi respuesta a continuación.
MaurerPower

Respuestas:

274

echa un vistazo a la página de manual de git-update-index y el bit --asumir-sin cambios y relacionado.

cuando tengo tu problema hago esto

git update-index --assume-unchanged dir-im-removing/

o un archivo específico

git update-index --assume-unchanged config/database.yml
csmosx
fuente
3
¿Puedes enumerar todos tus archivos ignorados de alguna manera?
Zitrax
21
Puede recuperar los archivos congit update-index --no-assume-unchanged config/database.yml
Denis Kniazhev
1
Vea la respuesta de Dave L a continuación para obtener una solución más nueva sin algunas de las deficiencias de --assume-unchanged.
Ben Challenor
2
¿Es posible agregar esto al archivo de configuración del repositorio, en lugar de ejecutar este comando manualmente cada vez?
Tim Boland
1
¿Aparecerá como modificado para la próxima confirmación? No quiero que se asuma sin cambios para siempre.
Pranav Nandan
41

Una opción más nueva y mejor es la git update-index --skip-worktreeque no se perderá en un restablecimiento completo o un nuevo cambio de un tirón.

Consulte la página de manual en http://schacon.github.com/git/git-update-index.html

Y una comparación en http://fallengamer.livejournal.com/93321.html

Dave L.
fuente
9
Una desventaja a tener en cuenta es que una vez que se ocultan las modificaciones de un archivo skip-worktree, encontrar estos archivos es un poco engorroso. La única forma que conozco es git ls-files -v |grep -v '^H'. Además, muchas herramientas GUI no conocen esta característica y pueden producir errores divertidos si, por ejemplo, checkoutfalla debido a archivos modificados "ocultos".
sleske
Nunca he podido entender CUALQUIERA de los archivos git doc. Entonces esto no es de mucha ayuda. (¡Cada archivo de documentos supone que comprende las sutilezas de todos los demás archivos de documentos!)
Scott Biggs
7

Usa este código

git update-index --assume-unchanged file-name
Sujiraj R
fuente
1
Muy interesante. Tengo que usar un passord en mi proyecto maven pero no quiero publicarlo en un repositorio git, por lo que pongo un marcador de posición sin valor en local, propiedades, lo confirmo, luego inserto la contraseña, pero marco el archivo sin cambios con su comando sugerido. Entonces la contraseña no está publicada.
Stefano Scarpanti
6

Los archivos rastreados no se pueden ignorar, por lo que primero deberá eliminarlos de su índice. Agregue un .gitignoreque ignore los directorios que no desea, luego bórrelos y elimine los rezagados con git rm --cached.

John Feminella
fuente
1
Hm, intento esto, pero luego tengo todos los archivos listados como eliminados. ¿Debo cometer eso y el --cached causará que no sea empujado a controles remotos? ¿O me dieron algo? ¿incorrecto? Lo más importante para mí es no corromper el repositorio remoto (svn).
1
No puede cometer nada que no comience en su índice. git rm: almacenó en caché todo lo que no desea confirmar, luego agregue un archivo .gitignore localmente que tenga "*". Ahora, no importa cuánto agregue, nunca volverá a ver esos archivos en su índice.
John Feminella
Ah, creo que entiendo, ahora en caché ... Solo elimina las cosas del índice, y deja solo el árbol de trabajo ... No estoy seguro de si me falta algo, pero AFAIS estoy buscando lo contrario , eliminándolo del árbol de trabajo sin tocar el índice ... ¿O puedo usarlo para eso de alguna manera?
6

Lo que suelo hacer es

escondite

git lo que sea

git alijo aplicar

git stash clear

Walter
fuente
10
fwiw también puede 'git stash pop' para hacer los dos últimos a la vez (aunque 'git stash clear' borrará TODAS las entradas de alijo, si así lo desea).
Groxx