Siguiente situación:
Estoy trabajando en una Mac con OS X y recientemente me uní a un proyecto cuyos miembros hasta ahora todos usan Windows. Una de mis primeras tareas fue configurar la base de código en un repositorio de Git, así que saqué el árbol de directorios de FTP e intenté ingresarlo en el repositorio de Git que había preparado localmente. Al intentar hacer esto, todo lo que obtuve fue esto
fatal: CRLF would be replaced by LF in blog/license.txt.
Como esto afecta a todos los archivos debajo de la carpeta "blog", estoy buscando una manera de convertir convenientemente TODOS los archivos del árbol a finales de línea de Unix. ¿Existe alguna herramienta que haga eso de forma inmediata o me hago una secuencia de comandos?
Como referencia, mi configuración de Git con respecto a los finales de línea:
core.safecrlf=true
core.autocrlf=input
fuente
find blog -type f | xargs dos2unix
Debería ser más rápido. Tampoco necesita-name *.*
ninguno, a menos que desee específicamente solo archivos con un punto en algún lugar del nombre. Eso es un globo de Windows, no uno * nix.find
axargs
fallará sifind
los partidos los archivos con espacios en blanco, citas, u otros caracteres cáscara meta en su camino. Como mínimo,find blog -type f -print0 | xargs -0 dos2unix
para manejar el caso del espacio en blanco. Debe usarfind
's en-exec
lugar de tuberías para evitar comillas, etc. Lados2unix
página de manual no especifica cuál es su comportamiento si lo invoca en archivos binarios. Si convierte CRLF en archivos binarios, los corromperá. Vea mi respuesta para una alternativa más segura, aunque más larga.Suponiendo que tiene GNU
grep
yperl
esto convertirá recursivamente CRLF a LF en archivos no binarios en el directorio actual:Cómo funciona
Encuentra recursivamente en el directorio actual; cambiar
.
ablog
owhatev
subdirectorios para limitar la sustitución:Solo coincide con archivos normales:
Probar si el archivo contiene CRLF. Excluir archivos binarios. Ejecuta
grep
comandos para cada archivo normal. Ese es el precio de excluir binarios. Si tiene una versión anteriorgrep
, puede intentar crear una prueba con elfile
comando:Reemplace CRLF con LF. El
'+'
con el segundo-exec
le dicefind
que acumule archivos coincidentes y los pase a una (o la menor cantidad posible) de invocaciones del comando, como canalizarxargs
, pero sin problemas si la ruta del archivo contiene espacios, comillas u otros metacaracteres de shell. Eli
en-pi
cuenta Perl para modificar el archivo en su lugar. Podrías usarsed
oawk
aquí con algo de trabajo, y probablemente cambiarás '+' a ';' e invocar un proceso separado para cada partido:fuente
grep -qIP '\r\n'
nunca coincide con nada en mi sistema CentOS. Cambiando agrep -qIP '\r$'
trabajado.node_modules
?find
parte del comando para excluir directorios. Sugieren usar-path
, pero también puede usar-regex
o-iregex
, es decir,-not -regex '.*/node_modules/.*'
lo que excluiránode_modules
a cualquier profundidad.regex
obash
novato, pero ¿qué pasa con múltiples exclusiones, digonode_module
ydist
por ejemplo?-P
bandera. OS X cambió de GNU grep a BSD grep. Algunas alternativas para OS X: stackoverflow.com/questions/16658333/…Aquí hay una mejor opción: Swiss File Knife . Funciona de forma recursiva en subdirectorios y maneja correctamente espacios y caracteres especiales.
Todo lo que tienes que hacer es:
Bonificación: sfk también hace muchas otras conversiones. Vea a continuación la lista completa:
EDITAR: una palabra de precaución: tenga cuidado al ejecutar esto en carpetas que tienen archivos binarios, ya que destruirá efectivamente sus archivos, particularmente los directorios .git . Si este es tu caso, haz no ejecute sfk en toda la carpeta, sino que seleccione extensiones de archivo específicas (* .rb, * .py, etc.). Ejemplo:
sfk remcr -dir chef -file .rb -file .json -file .erb -file .md
fuente
sfk
efectivamente toda mi carpeta .git y destruí un montón de binarios (de ahí mi edición ; no recuerdo si era Linux o Mac). Es posible que hayan cambiado el comportamiento predeterminado en versiones más recientes, pero aún así recomendaría especificar la extensión, para estar seguro.Esto es mucho más seguro ya que evita corromper tu repositorio de git. Agregue o reemplace .git, .svn con .bzr, .hg o cualquier fuente que controle su uso a la lista no .
fuente
En OS X, esto funcionó para mí:
Advertencia: haga una copia de seguridad de su directorio antes de ejecutar este comando.
fuente
Aquí una solución si usa sed:
-i
significa in situ, si desea crear una copia de seguridad también use-i.bak
's/\r$//'
reemplazará todos los retornos de carro (\r
) al final de cada líneafuente