Estou usando o git com minha equipe e gostaria de remover alterações de espaço em branco dos meus diffs, logs, mesclagens etc. Estou assumindo que a maneira mais fácil de fazer isso seria o git remover automaticamente o espaço em branco à direita (e outros erros de espaço em branco) ) de todas as confirmações conforme são aplicadas.
Eu tentei adicionar o seguinte ao ~/.gitconfig
arquivo, mas ele não faz nada quando eu confirmo. Talvez tenha sido projetado para algo diferente. Qual a solução?
[core]
whitespace = trailing-space,space-before-tab
[apply]
whitespace = fix
Estou usando ruby, caso alguém tenha alguma idéia específica sobre rubi. A formatação automática de código antes da confirmação seria o próximo passo, mas esse é um problema difícil e realmente não está causando um grande problema.
git
whitespace
githooks
mloughran
fonte
fonte
Respostas:
Essas configurações (
core.whitespace
eapply.whitespace
) não existem para remover o espaço em branco à direita, mas para:core.whitespace
: detectá-los e gerar errosapply.whitespace
: e retire-os, mas apenas durante o patch, nem sempre "automaticamente"Eu acredito que o
git hook pre-commit
faria um trabalho melhor para isso (inclui remover espaços em branco à direita)Observe que a qualquer momento você pode optar por não executar o
pre-commit
gancho:git commit --no-verify .
cd .git/hooks/ ; chmod -x pre-commit
Aviso: por padrão, um
pre-commit
script (como este ) não possui um recurso "remover à direita", mas um recurso de "aviso" como:No entanto, você pode criar um
pre-commit
gancho melhor , especialmente quando considera que:Por exemplo, oldman propõe em outra resposta um
pre-commit
gancho que detecta e remove os espaços em branco.Como esse gancho obtém o nome de cada arquivo, eu recomendaria ter cuidado com certos tipos de arquivos: você não deseja remover o espaço em branco à direita nos
.md
arquivos (descontos)!fonte
apply.whitespace
, enganando o git a tratar suas alterações na cópia de trabalho como um patch. Veja minha resposta abaixo ..editorconfig
arquivos têm uma regra específica para isso.<br>
: github.com/FriendsOfPHP/PHP-CS-Fixer/issues/…core.whitespace
paratrailing-space
comgit config
não gera erro ao confirmar nogit
2.5.0.Você pode induzir o Git a corrigir o espaço em branco para você, enganando o Git a tratar suas alterações como um patch. Ao contrário das soluções "gancho de pré-confirmação", essas soluções adicionam comandos de correção de espaço em branco ao Git.
Sim, estes são hacks.
Soluções robustas
Os seguintes aliases do Git são retirados do meu
~/.gitconfig
.Por "robusto", quero dizer que esses aliases são executados sem erros, fazendo a coisa certa, independentemente de a árvore ou o índice estarem sujos. No entanto, eles não funcionam se uma interativa
git rebase -i
já estiver em andamento; consulte o meu~/.gitconfig
para verificações adicionais se você se importa com este caso de canto, onde ogit add -e
truque descrito no final deve funcionar.Se você deseja executá-los diretamente no shell, sem criar um alias do Git, basta copiar e colar tudo entre aspas duplas (assumindo que o seu shell seja do tipo Bash).
Corrija o índice, mas não a árvore
O seguinte
fixws
alias do Git corrige todos os erros de espaço em branco no índice, se houver, mas não toca na árvore:A ideia é executar
git fixws
antesgit commit
se houver erros de espaço em branco no índice.Corrija o índice e a árvore
O
fixws-global-tree-and-index
alias do Git a seguir corrige todos os erros de espaço em branco no índice e na árvore, se houver:Para também corrigir espaços em branco em arquivos não versionados, faça
Soluções simples, mas não robustas
Essas versões são mais fáceis de copiar e colar, mas não fazem a coisa certa se suas condições colaterais não forem atendidas.
Corrija a subárvore com raiz no diretório atual (mas redefina o índice se não estiver vazio)
Usando
git add -e
para "editar" os patches com o editor de identidade:
:Corrija e preserve o índice (mas falhará se a árvore estiver suja ou o índice estiver vazio)
Corrija a árvore e o índice (mas redefine o índice se não estiver vazio)
Explicação do
export GIT_EDITOR=: && git -c apply.whitespace=fix add -ue .
truqueAntes de aprender sobre o
git rebase --whitespace=fix
truque desta resposta, eu estava usando ogit add
truque mais complicado em todos os lugares.Se o fizermos manualmente:
Defina
apply.whitespace
comofix
(você só precisa fazer isso uma vez):Isso diz ao Git para corrigir espaços em branco nos patches .
Convença o Git a tratar suas alterações como um patch :
Pressione a+ enterpara selecionar todas as alterações para cada arquivo. Você receberá um aviso sobre o Git corrigindo os erros de espaço em branco.
(
git -c color.ui=auto diff
neste momento, revela que suas alterações não indexadas são exatamente os erros de espaço em branco).Remova os erros de espaço em branco da sua cópia de trabalho:
Traga de volta suas alterações (se você não estiver pronto para confirmá-las):
O
GIT_EDITOR=:
meio de usar:
como editor e como comando:
é a identidade.fonte
set VISUAL= && git add -ue . && git checkout .
Observe o '.
' usado comgit add
: isso é devido ao git1.8.3git commit
use o editor errado? Envolvo aVISUAL=
parte em um subshell na versão unix acima para evitar isso, mas não sei se o DOS tem subshells.core.editor
configurou, a exportaçãoVISUAL
não terá efeito, pois a configuração terá precedência porman git-var
. Para substituir isso, você precisa exportarGIT_EDITOR=:
.fixws
para falhar rapidamente, se você já estiver em uma recuperação interativa, pois, caso contrário, ela morrerá nagit rebase --whitespace=fix
linha e deixará você em um estado estranho. I emprestado esta pergunta e acabou de adicionar um caso extra antes do caso:fixws = !"\ if test -d $(git rev-parse --git-dir)/rebase-merge ; then \ echo 'In rebase - cannot fixws' ; \ elif (! git diff-files --quiet .) && \ (! git diff-index --quiet --cached HEAD) ; then \ ...
Encontrei um gancho de pré-confirmação do git que remove os espaços em branco à direita .
fonte
sed
invocação (sed -r 's/:[0-9]+:.*//'
) pode ser substituída porcut -f1 -d:
. Isso deve funcionar da mesma forma nas plataformas Linux e BSD.cut
não é tão seguro quanto o segundosed
: o corte falhará no caso (altamente improvável) de nomes de arquivos que contêm ":". Você poderia usarawk 'NF>2{NF-=2}1'
para ser segurocore.autocrlf=true
estiver usando , poderá adicionardos2unix -D "$FILE"
dentro do loop for, depois do sed. Caso contrário, ele mudará todos os CRLFs para LFs emitindo apenas sed.git add
dentro de um gancho de confirmação parece muito ruim para mim. E se você estiver fazendo teste / confirmação parcial de um arquivo? Você não quer que o arquivo completo seja confirmado pelas costas, não é?No Mac OS (ou, provavelmente, em qualquer BSD), os parâmetros do comando sed precisam ser um pouco diferentes. Tente o seguinte:
Salve este arquivo como
.git/hooks/pre-commit
- ou procure o que já está lá e cole o pedaço inferior em algum lugar dentro dele. E lembre-sechmod a+x
disso também.Ou para uso global (via Git commit hooks - configurações globais ), você pode colocá-lo
$GIT_PREFIX/git-core/templates/hooks
(onde GIT_PREFIX é / usr ou / usr / local ou / usr / share ou / opt / local / share) e executargit init
dentro de seus repositórios existentes.De acordo com
git help init
:fonte
git hash-object -w
egit update-index
(re) inserir o arquivo munged diretamente no índice. Alguém muito corajoso.Prefiro deixar essa tarefa para o seu editor favorito.
Basta definir um comando para remover os espaços finais ao salvar.
fonte
(add-hook 'before-save-hook 'delete-trailing-whitespace)
ao seu.emacs
arquivo. Emacs espaços em branco truquesUsando atributos git e configuração de filtros com git config
OK, esta é uma nova abordagem para resolver esse problema ... Minha abordagem é não usar ganchos, mas usar filtros e atributos git. O que isso permite, é configurar, em cada máquina em que você desenvolve, um conjunto de filtros que eliminam o espaço em branco e as linhas em branco no final dos arquivos antes de enviá-los. Em seguida, configure um arquivo .gitattributes que indique em quais tipos de arquivos o filtro deve ser aplicado. Os filtros têm duas fases,
clean
que são aplicadas ao adicionar arquivos ao índice esmudge
que são aplicadas ao adicioná-los ao diretório de trabalho.Diga ao seu git para procurar um arquivo de atributos globais
Primeiro, diga à sua configuração global para usar um arquivo de atributos globais:
Crie filtros globais
Agora, crie o filtro:
Adicione a mágica do script sed
Por fim, coloque o
fixup-eol-eof
script em algum lugar do seu caminho e torne-o executável. O script usa sed para fazer algumas edições dinâmicas (remova espaços e espaços em branco no final das linhas e linhas em branco estranhas no final do arquivo)fixup-eol-eof deve ficar assim:
minha essência disso
Diga ao git quais tipos de arquivo aplicar o filtro recém-criado
Por fim, crie ou abra ~ / .gitattributes_global no seu editor favorito e adicione linhas como:
Portanto, se quisermos corrigir o problema de espaço em branco, para todos os nossos arquivos de origem c, adicionaremos uma linha parecida com esta:
Discussão do filtro
O filtro tem duas fases, a fase limpa, que é aplicada quando as coisas são adicionadas ao índice ou registradas, e a fase de borrar, quando o git coloca coisas no seu diretório de trabalho. Aqui, nossa mancha está apenas executando o conteúdo através do
cat
comando que deve mantê-lo inalterado, com a exceção de possivelmente adicionar um caractere de nova linha à direita, se não houver um no final do arquivo. O comando clean é a filtragem de espaço em branco que juntei das notas em http://sed.sourceforge.net/sed1line.txt . Parece que deve ser colocado em um shell script, não consegui descobrir como injetar o comando sed, incluindo o saneamento de linhas extras estranhas no final do arquivo diretamente no arquivo git-config. (Você PODEse livrar dos espaços em branco à direita, no entanto, sem a necessidade de um script sed separado, defina-ofilter.fix-eol-eof
como algo comosed 's/[ \t]*$//' %f
onde\t
está uma guia real, pressionando tab.)A exigência = true faz com que um erro seja gerado se algo der errado, para mantê-lo longe de problemas.
Por favor, perdoe-me se minha linguagem sobre o git for imprecisa. Acho que tenho uma compreensão bastante boa dos conceitos, mas ainda estou aprendendo a terminologia.
fonte
.git
pasta e não globalmente, o que pode fazer mais sentido.Eu escrevi esse gancho de pré-confirmação, que remove apenas o espaço em branco à direita das linhas que você alterou / adicionou, pois as sugestões anteriores tendem a criar confirmações ilegíveis se os arquivos de destino tiverem muito espaço em branco à direita.
fonte
Por favor, tente meus ganchos pré-confirmação , ele pode detectar automaticamente o espaço em branco à direita e removê-lo . Obrigado!
pode funcionar em baixo
GitBash(windows), Mac OS X and Linux
!Instantâneo:
fonte
git commit -no-verify
, alguma sugestão?.md
arquivos e não remover os espaços em branco, em vez de pedir ao usuário final para adicionar uma--no-verify
opção nogit commit
.+
ou-
Aqui está uma versão compatível com ubuntu + mac os x:
Diverta-se
fonte
Estava pensando sobre isso hoje. Isso é tudo o que acabei fazendo em um projeto java:
fonte
Para usuários de texto sublime .
Defina o seguinte corretamente na sua configuração User-Setting .
"trim_trailing_white_space_on_save": true
fonte
*.md
arquivos (markdown) que dependem de "" (espaços duplos à direita) para marcar um simples<br />
, e essa configuração parece se aplicar a todos os arquivos, incluindo os que eu não quero remover os espaços à direita.o loop for para arquivos usa a variável de shell $ IFS. no script fornecido, os nomes de arquivos com um caractere que também esteja na variável $ IFS serão vistos como dois arquivos diferentes no loop for. Este script o corrige: o modificador de modo multilinha, dado o sed-manual, não parece funcionar por padrão na minha caixa do ubuntu, então procurei uma implementação diferente e a encontrei com um rótulo iterativo, essencialmente ele só começará a substituição no última linha do arquivo, se eu entendi corretamente.
[1] padrão sed-subsition: como substituir uma nova linha (\ n) usando sed? .
fonte
Isso não remove os espaços em branco automaticamente antes de uma confirmação, mas é bastante fácil de efetuar. Coloquei o seguinte script perl em um arquivo chamado git-wsf (correção de espaço em branco do git) em um diretório em $ PATH para que eu possa:
git wsf | sh
e remove todo o espaço em branco apenas das linhas de arquivos que o git reporta como um diff.
fonte
Um pouco tarde, mas como isso pode ajudar alguém lá fora, aqui vai.
Abra o arquivo no VIM. Para substituir guias por espaços em branco, digite o seguinte na linha de comando do vim
Para se livrar de outros espaços em branco à direita
Isso praticamente fez por mim. É entediante se você tiver muitos arquivos para editar. Mas achei mais fácil do que pré-confirmar ganchos e trabalhar com vários editores.
fonte
sed -i 's|\t| |g' filenames
(espaços na posição de substituição). Observe que você pode usar o find para obter seus nomes de arquivos. Se você ainda não pensou em como obter esse backup, normalmente apenas confirmo tudo e depois 'desfazo' o commit com uma redefinição suave de volta para onde estou; às vezes eu adiciono tudo à árvore, mas não faço commit, e às vezes eu uso o stash / apply (não pop!). Se me sinto ansioso, sincronizo toda a minha árvore em um local seguro antes de me intrometer ...Para excluir espaços em branco à direita no final da linha em um arquivo, use
ed
:fonte
Provavelmente, isso não resolverá diretamente o seu problema, mas você pode configurá-los via git-config no espaço real do projeto, que edita ./.git/config em oposição a ~ / .gitconfig. É bom manter as configurações consistentes entre todos os membros do projeto.
fonte