Seguinte situação:
Estou trabalhando em um Mac executando o OS X e ingressei recentemente em um projeto cujos membros até agora usam o Windows. Uma das minhas primeiras tarefas foi configurar a base de código em um repositório Git, então puxei a árvore de diretórios do FTP e tentei fazer o check-in no repositório Git que havia preparado localmente. Ao tentar fazer isso, tudo que eu consegui foi isso
fatal: CRLF would be replaced by LF in blog/license.txt.
Como isso afeta todos os arquivos abaixo da pasta "blog", estou procurando uma maneira de converter convenientemente TODOS os arquivos da árvore em finais de linha Unix. Existe uma ferramenta que faça isso imediatamente ou recebo scripts de algo?
Para referência, minha configuração do Git sobre finais de linha:
core.safecrlf=true
core.autocrlf=input
fonte
find blog -type f | xargs dos2unix
deve ser mais rápido. Você também não precisa-name *.*
, a menos que deseje especificamente apenas arquivos com um ponto em algum lugar do nome. Isso é um glob do windows, não um * nix.find
paraxargs
falhará sefind
corresponder a qualquer arquivo com espaço em branco, aspas ou outros metacaracteres do shell no caminho. No mínimo, usefind blog -type f -print0 | xargs -0 dos2unix
para lidar com o caso de espaço em branco. Você deve usarfind
's' em-exec
vez de canalizar para evitar aspas, etc. Ados2unix
página de manual não especifica qual é o seu comportamento se você o chamar em arquivos binários. Se ele converter o CRLF em arquivos binários, ele será corrompido. Veja minha resposta para uma alternativa mais segura, embora mais longa.Supondo que você tenha o GNU
grep
eperl
isso converterá recursivamente o CRLF em LF em arquivos não binários no diretório atual:Como funciona
Encontre recursivamente no diretório atual; mudar
.
parablog
ouwhatev
subdiretórios para limitar a substituição:Corresponda apenas aos arquivos regulares:
Teste se o arquivo contém CRLF. Excluir arquivos binários. Executa o
grep
comando para todos os arquivos regulares. Esse é o preço da exclusão de binários. Se você tem um antigo,grep
pode tentar criar um teste usando ofile
comando:Substitua CRLF por LF. O
'+'
with with second-exec
dizfind
para acumular arquivos correspondentes e passá-los para uma (ou o menos possível) invocações do comando - como canalizar paraxargs
, mas sem problemas, se o caminho do arquivo contiver espaços, aspas ou outros meta caracteres do shell. Oi
in-pi
diz ao perl para modificar o arquivo no local. Você pode usarsed
ouawk
aqui com algum trabalho e provavelmente mudará '+' para ';' e invoque um processo separado para cada correspondência:fonte
grep -qIP '\r\n'
nunca corresponde a nada no meu sistema CentOS. Mudando paragrep -qIP '\r$'
funcionou.node_modules
?find
parte do comando para excluir diretórios. Eles sugerem o uso-path
, mas você também pode usar-regex
or-iregex
, ou seja, o-not -regex '.*/node_modules/.*'
que excluirá umnode_modules
a qualquer profundidade.regex
oubash
noob, mas e quanto a várias exclusões, digamosnode_module
edist
por exemplo?-P
sinalizador. OS X mudou de GNU grep para BSD grep. Algumas alternativas para OS X: stackoverflow.com/questions/16658333/...Aqui está uma opção melhor: Swiss File Knife . Ele funciona recursivamente em subdiretórios e lida com espaços e caracteres especiais corretamente.
Tudo o que tem a fazer é:
Bônus: o sfk também faz muitas outras conversões. Veja abaixo a lista completa:
EDIT: uma palavra de cautela: tenha cuidado ao executá-lo em pastas com arquivos binários, pois isso destruirá efetivamente seus arquivos, principalmente os diretórios .git . Se esse for o seu caso, não execute sfk na pasta inteira, mas selecione extensões de arquivo específicas (* .rb, * .py, etc). Exemplo:
sfk remcr -dir chef -file .rb -file .json -file .erb -file .md
fonte
sfk
efetivamente processei toda a minha pasta .git e destruiu vários binários (daí a minha edição ; não me lembro se era Linux ou Mac). Eles podem ter alterado o comportamento padrão em versões mais recentes, mas eu ainda recomendo especificar a extensão, para que seja seguro.Isso é muito mais seguro, pois evita a corrupção do seu repositório Git. Adicione ou substitua .git, .svn por .bzr, .hg ou qualquer outra fonte que esteja controlando seu uso na lista not .
fonte
No OS X, isso funcionou para mim:
Aviso: Faça backup do seu diretório antes de executar este comando.
fonte
Aqui está uma solução se estiver usando sed:
-i
significa local, se você deseja criar um backup também-i.bak
's/\r$//'
substituirá todos os retornos de carro (\r
) no final de cada linhafonte