Deshacer git update-index --assume-unchanged <file>

464

La forma en que Git ignora mirar / rastrear un directorio / archivo en particular. solo ejecutas esto:

git update-index --assume-unchanged <file>

Ahora, ¿cómo lo deshaces para que se los vuelva a ver? (Llamémoslo sin asumir).

adardesign
fuente
55
Solo una nota para decir que parece que skip-worktree es con toda probabilidad lo que sería mejor usar que asumir sin cambios, a menos que el rendimiento de git sea su problema. stackoverflow.com/questions/13630849/…
GreenAsJade

Respuestas:

588

Para obtener deshacer / mostrar directorios / archivos que están configurados para asumir sin cambios, ejecute esto :

git update-index --no-assume-unchanged <file>

Para obtener una lista de los directorios / archivos que se assume-unchangedejecutan esto :

git ls-files -v|grep '^h'

adardesign
fuente
77
Una mejora menor a su declaración grep, podría usar '^ [az]' para capturar todos los archivos ignorados, ya que la primera etiqueta de letra podría ser letras distintas de 'H' / 'h'. Desde git-scm.com/docs/git-ls-files : esta opción identifica el estado del archivo con las siguientes etiquetas (seguidas de un espacio) al comienzo de cada línea: H :: caché S :: skip-worktree M: : sin fusionar R :: eliminado / eliminado C :: modificado / cambiado K :: para ser asesinado? :: otro
Bdoserror
8
Otro truco útil es git ls-files -v|grep '^h'|cut -c3-, que le dará solo los nombres de los archivos, sin el prefijo "h".
Retsam
99
Si ya no conoce los archivos assume-unchanged, simplemente utilícelos git update-index --really-refresh. Con ese comando, no necesita buscar git ls-filesprimero los archivos .
theDmi
103

Si este es un comando que usa con frecuencia, puede considerar tener un alias para él también. Añadir a su global .gitconfig:

[alias]
    hide = update-index --assume-unchanged
    unhide = update-index --no-assume-unchanged

Cómo configurar un alias (si aún no lo sabe):

git config --configLocation alias.aliasName 'command --options'

Ejemplo:

git config --global alias.hide 'update-index --assume-unchanged'
git config... etc

Después de guardar esto en su .gitconfig, puede ejecutar un comando más limpio.

git hide myfile.ext

o

git unhide myfile.ext

Esta documentación de git fue muy útil.

Según los comentarios, este también es un alias útil para averiguar qué archivos están ocultos actualmente:

[alias]
    hidden = ! git ls-files -v | grep '^h' | cut -c3-
adswebwork
fuente
2
Este alias también es útil:hidden = ! git ls-files -v | grep '^h' | cut -c3-
seanf
42

La función git update-index tiene varias opciones que puede encontrar escribiendo a continuación:

git update-index --help

Aquí encontrará varias opciones: cómo manejar con la función update-index.

[si no conoce el nombre del archivo]

git update-index --really-refresh 

[si conoce el nombre del archivo]

git update-index --no-assume-unchanged <file>

revertirá todos los archivos que se hayan agregado en la lista de ignorados.

git update-index --assume-unchanged <file>
Ankit Vishwakarma
fuente
git update-index --rereal-refresh, deshacer todo lo que supongo que no he cambiado, gracias por el consejo
Sérgio
git update-index --no-assume-unchanged <file>salvó mi vida ... ok, podría sincronizar la carpeta nuevamente, pero quería una solución "real" para este problema.
Cagatay Ulubay
38

Supongo que querías decir --assume-unchanged, ya que no veo ninguna --assume-changedopción. El inverso de --assume-unchangedes --no-assume-unchanged.

hobbs
fuente
32

Para sintetizar las excelentes respuestas originales de @adardesign, @adswebwork y @AnkitVishwakarma, y ​​los comentarios de @Bdoserror, @Retsam, @seanf y @torek, con enlaces de documentación adicionales y alias concisos ...

Comandos básicos

Para restablecer un archivo que se supone que no ha cambiado a la normalidad:

git update-index --no-assume-unchanged <file>

Para enumerar todos los archivos que se supone que no han cambiado:

git ls-files -v | grep '^[a-z]' | cut -c3-

Para restablecer todos los archivos asumidos sin cambios a la normalidad:

git ls-files -v | grep '^[a-z]' | cut -c3- | xargs git update-index --no-assume-unchanged --

Nota: Este comando que se ha enumerado en otro lugar ya no parece restablecer todos los archivos asumidos sin cambios (creo que solía hacerlo y lo enumeró anteriormente como una solución):

git update-index --really-refresh

Atajos

Para que estas tareas comunes sean fáciles de ejecutar en git, agregue / actualice la siguiente sección de alias.gitconfig para su usuario (por ejemplo, ~/.gitconfigen un sistema * nix o macOS):

[alias]
    hide = update-index --assume-unchanged
    unhide = update-index --no-assume-unchanged
    unhide-all = ! git ls-files -v | grep '^[a-z]' | cut -c3- | xargs git update-index --no-assume-unchanged --
    hidden = ! git ls-files -v | grep '^[a-z]' | cut -c3-
Will Cain
fuente
1
Para git hidden, puede lograr el mismo efecto sin alias de shell o scripts, usando !así:hidden = ! git ls-files -v | grep '^h' | cut -c3-
seanf
1
--really-refreshno (o ya no lo hace, tal vez lo hizo antes) borra los indicadores de asumir sin cambios en los archivos de índice.
torek
Gracias @torek! Confirmé el comportamiento que describiste y actualicé la respuesta con una solución diferente al caso "restablecer todo".
Will Cain
20

Si desea deshacer todos los archivos que se aplicaron, suponga que no han cambiado con ningún estado, no solo en caché (git los marca por caracteres en minúsculas), puede usar el siguiente comando:

git ls-files -v | grep '^[a-z]' | cut -c 3- | tr '\012' '\000' | xargs -0 git update-index --no-assume-unchanged
  1. git ls-files -v imprimirá todos los archivos con su estado
  2. grep '^[a-z]' filtrará los archivos y seleccionará solo asumir sin cambios
  3. cut -c 3- eliminará el estado y dejará solo rutas, cortando desde el tercer carácter hasta el final
  4. tr '\012' '\000' reemplazará el carácter de final de línea (\ 012) a cero (\ 000)
  5. xargs -0 git update-index --no-assume-unchangedpasará todos los caminos separados por cero caracteres git update-index --no-assume-unchangeda deshacer
C0DEF52
fuente
Esto es muy útil ¡Gracias por la información detallada!
Chamithra Thenuwara
11

Además de @adardesignla respuesta, si desea restablecer todos los archivos que se han agregado a la assume-unchangedlista de no-assume-unchangeduna sola vez, puede hacer lo siguiente:

git ls-files -v | grep '^h' | sed 's/^..//' | sed 's/\ /\\ /g' | xargs -I FILE git update-index --no-assume-unchanged FILE || true

Esto simplemente eliminará la salida de dos caracteres de grep "h ", es decir , luego escapará de cualquier espacio que pueda estar presente en los nombres de archivo, y finalmente || trueevitará que el comando termine prematuramente en caso de que algunos archivos en el bucle tengan errores.

sagunms
fuente
4

Si está utilizando extensiones de Git , siga los pasos a continuación:

  1. Ir a la ventana de confirmación.
  2. Haga clic en el menú desplegable denominado Cambios en el directorio de trabajo .
  3. Seleccione la opción Mostrar archivos sin cambios asumidos .
  4. Haga clic derecho sobre el archivo que desea eliminar.
  5. Seleccione No suponer sin cambios .

Estás listo.

Shivang Gupta
fuente
0

Nada aquí que no esté cubierto. Pero me gustaría agregar mis 2 centavos. A veces, ejecuto una compilación y cambia muchos archivos y luego quiero trabajar en algo, por lo que este comando realmente me ayuda mucho.

git update-index --assume-unchanged `git status | grep modified | sed 's|modified:||g'| xargs`

Espero que alguien más lo encuentre útil también.

Tyagi Akhilesh
fuente
Creo que te beneficiaría usarlo .gitignorepara ignorar tus artefactos de construcción.
Nick
1
Tengo .gitignorepero eso es a veces, en mi experiencia no es suficiente. Pero entiendo el contexto en el que estás diciendo esto.
Tyagi Akhilesh
0

Ninguna de las soluciones funcionó para mí en Windows: parece usar capital en Hlugar de hpara el estado del archivo y el comando grep requiere un cuidado adicional, ya que ^también representa el inicio de la línea y niega el siguiente carácter.

Solución de Windows

  1. Abra Git Bash y cambie al directorio de nivel superior correspondiente.
  2. git ls-files -v | grep '^^H' para enumerar todos los archivos no almacenados en caché
  3. git ls-files -v | grep '^^H' | cut -c 3- | tr '\012' '\000' | xargs -0 git update-index --no-skip-worktree para deshacer la omisión de archivos de todos los archivos que se hicieron a través de update-index --skip-worktree
  4. git ls-files -v | grep '^^H]' | cut -c 3- | tr '\012' '\000' | xargs -0 git update-index --no-assume-unchanged para deshacer la omisión de archivos de todos los archivos que se hicieron a través de update-index --assume-unchanged
  5. git ls-files -v | grep '^^H' para volver a enumerar todos los archivos no almacenados en caché y verificar si los comandos anteriores han funcionado; esto ahora no debería devolver nada
Steve Chambers
fuente
-1

Si está utilizando eclipse, puede encontrar útil lo siguiente:

no asumir sin cambios con eclipse

Antonio
fuente
1
¿Por qué los votos negativos por favor?
Antonio