Resync git repo con nuevo archivo .gitignore

192

¿Es posible "actualizar" un repositorio git después de actualizar el archivo gitignore?

Acabo de agregar más ignoraciones (?) A mi gitignore y me gustaría eliminar cosas que ya están en el repositorio que coinciden con el nuevo archivo.

Christian Wattengård
fuente
Podría ser, ¿eliminaría esa solución los archivos ya comprometidos que coinciden con el nuevo gitignore?
Christian Wattengård
100
+1 por inventar la palabra "ignorancia".
Aasmund Eldhuset
3
en.wiktionary.org/wiki/ignoration @AasmundEldhuset es oficial
Daniel Springer
1
@ user770: ¡Hoy aprendí!
Aasmund Eldhuset

Respuestas:

372

La solución mencionada en "el archivo .gitignore no ignora " es un poco extrema, pero debería funcionar:

# rm all files
git rm -r --cached .
# add all files as per new .gitignore
git add .
# now, commit for new .gitignore to apply
git commit -m ".gitignore is now working"

( asegúrese de confirmar primero los cambios que desea conservar , para evitar cualquier incidente como comenta jball037 a continuación .
Sin embargo, la--cached opción mantendrá sus archivos intactos en su disco).

También tiene otra solución más detallada en la publicación del blog " Hacer que Git ignore los archivos ya rastreados ":

git rm --cached `git ls-files -i --exclude-standard`

Bassim sugiere en su edición :

Archivos con espacio en sus caminos

En caso de que aparezca un mensaje de error como fatal: path spec '...' did not match any files, puede haber archivos con espacios en su ruta.

Puede eliminar todos los demás archivos con la opción --ignore-unmatch:

git rm --cached --ignore-unmatch `git ls-files -i --exclude-standard`

pero los archivos no coincidentes permanecerán en su repositorio y deberán eliminarse explícitamente encerrando su ruta con comillas dobles:

git rm --cached "<path.to.remaining.file>"
VonC
fuente
He descubierto que el paso git add es innecesario, cuando ejecuto el estado git después de git rm --cached, los archivos eliminados ya están en el área de preparación y puede continuar y confirmarlos.
cap
3
Acabo de ejecutar esto, perdí todos mis cambios no comprometidos y casi anuncié mi renuncia a mi trabajo. La respuesta aceptada en este hilo me salvó la vida: stackoverflow.com/questions/2125710/how-to-revert-a-git-rm-r
jball037
2
@VonC lo siento, eso no estaba destinado a ser un despotricar o un palo :) Pero sí, utilicé --cached y todos mis cambios no confirmados se perdieron cuando revisé mis archivos. Presa del pánico por un momento, pero "git reset HEAD" restaurado mis archivos (pero esta vez sin los archivos que se especifica en .gitignore, por lo que su solución aún funcionaba!)
jball037
3
@ jball037 Bien. Agregué la advertencia y edité la respuesta en consecuencia.
VonC
1
si solo leo una línea más antes de hacer esto "(asegúrese de confirmar primero los cambios que desea conservar, para evitar cualquier incidente como jball037" #fml
Aiden Strydom
9

Podría malinterpretarlo, pero ¿está tratando de eliminar archivos recientemente ignorados o desea ignorar nuevas modificaciones a estos archivos? En este caso, la cosa está funcionando.

Si desea eliminar archivos ignorados previamente comprometidos, use

git rm –cached `git ls-files -i –exclude-standard`
git commit -m 'clean up'
Graco
fuente
¿Qué pasa con las comillas simples aquí?
IgorGanapolsky
Esta es una gran respuesta
Holene
Esta es una razón muy simple para eliminar archivos después de actualizar mi .gitignore Sin embargo, necesita un par de actualizaciones menores: `` git rm –cached git ls-files -i –exclude-standard git commit -m 'clean' '
Aaron
1

Sé que esta es una vieja pregunta, pero la solución de Gracchus no funciona si los nombres de archivo contienen espacios. La solución de VonC para archivar nombres con espacios es no eliminarlos utilizando --ignore-unmatch, luego eliminarlos manualmente, pero esto no funcionará bien si hay muchos.

Aquí hay una solución que utiliza matrices bash para capturar todos los archivos.

# Build bash array of the file names
while read -r file; do 
    rmlist+=( "$file" )
done < <(git ls-files -i --exclude-standard)

git rm –-cached "${rmlist[@]}"

git commit -m 'ignore update'
Jason
fuente