Recursivamente replace una cadena evitando con security los directorys de git

¿Cómo puedo replace todas las instancias de ABC con XYZ en el directory actual y todos los subdirectorys?

En esta pregunta popular, las respuestas principales señalan que no es prudente ejecutar commands como

 find /home/www -type f -print0 | xargs -0 sed -i 's/subdomainA\.example\.com/subdomainB.example.com/g' 

en una carpeta que contiene .git directory .git , porque el historial puede dañarse.

¿Cómo puedo hacer un reemploop en una carpeta que tiene un directory .git ? ¿Cómo es esto?:

 find /home/www/ -type f -not -path .git/ -exec \ sed -i 's/ABC/XYZ/g' {} + 

Necesita "podar" el directory .git . La directiva -prune de -prune siempre tiene éxito y, como efecto secundario, finaliza la búsqueda dentro del directory; y find's or operador es cortocircuito, entonces:

 find $top -name .git -prune -o -type f -print0 | xargs -0 ... 

por ejemplo. Esto dice: para cada file, si el nombre es .git y -prune tiene éxito, hemos terminado (y -prune tuvo éxito y no descendemos a .git ). De lo contrario, el nombre no era .git , entonces hacemos la cláusula "o": si el tipo es "file", -print0 .

Por lo tanto, esto imprime todos los nombres de los files que no son un directory .git , ni dentro de un directory .git . (Por supuesto, un directory .git tampoco es un file, pero tuvimos que probarlo para poder usar -prune ).

En esta pregunta popular, las respuestas principales indican que no es prudente ejecutar commands como find /home/www -type f -print0 | xargs -0 sed -i 's/ABC/ABX/g' find /home/www -type f -print0 | xargs -0 sed -i 's/ABC/ABX/g' en una carpeta que contiene el directory .git, porque el historial puede dañarse.

No se trata solo de directorys de git, sino de cualquier cosa que se use para el desarrollo de software. Construye productos, bases de datos, resultados esperados de las testings … un command como ese mendiga problemas.

 git grep -lIz ABC | xargs -0 sed -i 's/ABC/DEF/g' 

obtendrá los files de text rastreados, es un comienzo decente, y también puede proporcionar patrones de ruta (por ejemplo, git grep foobar -- '*.[ch]' muestra todas las líneas coincidentes en los files .c y .h rastreados)