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. cd
en 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-index
comando funciona. ¿Qué no funciona con las tuberías?
No, no es suficiente para mí agregar dir
a .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.
fuente
git ls-files -z
git ls-files -z | xargs -0 git update-index --no-assume-unchanged
, creo que ...git ls-files -z | git update-index -z --stdin
es más limpio.El
find
comando de GNU Findutils tiene una-exec
opción que elimina la mayor parte de la molestia de usarxargs
, 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 toma todos los argumentos después de
-exec
hasta;
(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
find
los 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-exec
puede hacer todo tipo de cosas poderosas.No estoy seguro de otras implementaciones del
find
comando. YMMV.fuente
-exec
es 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.Agregue el nombre del directorio a
.git/info/exclude
. Esto funciona para archivos sin seguimiento.fuente
Sí,
funciona solo con archivos, no con directorios. Creo que una de las formas más rápidas:
fuente
cd
, se puede pasar el directorio como argumento final:git ls-files -- $DIR | xargs -l git update-index --assume-unchanged -- $DIR
.