git update-index - se supone que no se modifica en el directorio

101

git 1.7.12

Quiero marcar todos los archivos debajo de un directorio dado como asumir sin cambios.

1) git update-index --assume-unchaged dir/da "Ignorar el camino".

2) git update-index --assume-unchaged dir/*falla rápidamente porque encontrará archivos que no están siendo rastreados, por lo que da "fatal: No se puede marcar el archivo" y se cierra.

3) Intente generar una lista de archivos para marcar. cden el directorio deseado y luego ejecutar git ls-files | tr '\n' ' ' | git update-index --assume-unchanged. Esto no produce ningún mensaje de error, pero no marca correctamente los archivos. La primera parte del comando, git ls-files | tr '\n' ' 'produce correctamente una lista delimitada por espacios de todos los archivos que quiero marcar. Si copio y pego la salida de ese comando en la línea de comandos, entonces el git update-indexcomando funciona. ¿Qué no funciona con las tuberías?

No, no es suficiente para mí agregar dira .gitignore. Necesito que estos archivos estén en el repositorio, pero los cambios no deseados se realizarán localmente que deben ignorarse para que los usuarios puedan hacer extracciones.

Xander Dunn
fuente

Respuestas:

173

git update-index quiere los nombres de archivo en su línea de comando, no en su entrada estándar.

Paso 1:

cd en la carpeta que desea asumir que no ha cambiado

Paso 2:

Puede hacer esto:

git update-index --assume-unchanged $(git ls-files | tr '\n' ' ')

o

git ls-files | tr '\n' ' ' | xargs git update-index --assume-unchanged

Aunque, en cualquier caso, los nombres de archivo con espacios serán problemáticos. Si tiene esos, puede usar esto:

git ls-files -z | xargs -0 git update-index --assume-unchanged

Editar: información incorporada de @MatthewScharley con respecto a git ls-files -z.

Comandos de Windows

Nota: si está en Windows, use Git Bash para ejecutar estos comandos

Twalberg
fuente
2
FYI, que `| tr '\ n' '' `bit es innecesario.
Václav Slavík
7
@twalberg: Podrías usargit ls-files -z
Matthew Scharley
2
@twalberg Cómo deshacer este comando "git ls-files -z | xargs -0 git update-index --assume-sin cambios"
Mohamed Hussain
3
@MohamedHussain git ls-files -z | xargs -0 git update-index --no-assume-unchanged, creo que ...
twalberg
1
git ls-files -z | git update-index -z --stdines más limpio.
Jed
22

El findcomando de GNU Findutils tiene una -execopción que elimina la mayor parte de la molestia de usar xargs, aunque su sintaxis es un poco especial. Sin embargo, se ocupa perfectamente de los nombres de archivo con espacios.

Este comando hará que git asuma que todos los archivos en y bajo el directorio listado no han cambiado:

find path/to/dir -type f -exec git update-index --assume-unchanged '{}' \;

Find toma todos los argumentos después de -exechasta ;(del cual debe escapar para que su shell no se los coma) y los ejecuta una vez por cada archivo encontrado, mientras reemplaza {}(nuevamente, entre comillas simples para que su shell no se lo coma) con el nombre del archivo encontrado.

Usando findlos criterios de coincidencia (máxima profundidad de recursividad, si la coincidencia es un archivo o un directorio, si el nombre del archivo coincide con una expresión) y -execpuede hacer todo tipo de cosas poderosas.

No estoy seguro de otras implementaciones del findcomando. YMMV.

ellos llaman himart
fuente
2
-execes una opción estándar . También puede -exec git update-index --assume-unchanged {} +(también definido por el estándar) pasar varios nombres de archivo al comando a la vez, reduciendo la cantidad de veces que se invoca el comando git.
Tom Fenech
16

Agregue el nombre del directorio a .git/info/exclude. Esto funciona para archivos sin seguimiento.

Steve Pitchers
fuente
¡Este trabajo genial! ¿Sabías si esto también funciona con archivos?
betomoretti
¡Pero esto no empuja a los archivos sin seguimiento github! ¿Hay alguna forma posible de simplemente ignorarlos de los registros pero realmente mantenerlos en los repositorios?
Mahmoud Zalt
2

Sí,

git update-index --assume-unchanged

funciona solo con archivos, no con directorios. Creo que una de las formas más rápidas:

cd dir
ls | xargs -l git update-index --assume-unchanged
Víctor Perov
fuente
2
En vez de usar cd, se puede pasar el directorio como argumento final: git ls-files -- $DIR | xargs -l git update-index --assume-unchanged -- $DIR.
2014