Como faço para forçar o git a fazer o checkout do branch master e remover os retornos de carro depois de normalizar os arquivos usando o atributo “text”?

101

Ok, então adicionei o arquivo .gitattributescom linhas como esta

*.css text
*.js text
etc...

Em seguida, segui as instruções em http://git-scm.com/docs/gitattributes#_checking-out_and_checking-in

$ rm .git/index     # Remove the index to force Git to
$ git reset         # re-scan the working directory
$ git status        # Show files that will be normalized
$ git add -u
$ git add .gitattributes
$ git commit -m "Introduce end-of-line normalization"

Mas agora minha cópia de trabalho ainda tem os retornos de carro! Tenho arquivos não rastreados que gostaria de manter. Como faço para fazer o git verificar o branch master novamente com os arquivos normalizados?

Eu sei que os arquivos são normalizados no repositório porque quando clono o repo, tenho todos os arquivos sem os retornos de carro.

Jason
fonte

Respostas:

264

Ahah! Verifique o commit anterior e, a seguir, verifique o master.

git checkout HEAD^
git checkout -f master
Jason
fonte
5
Obrigado por esta solução alternativa, mas é um problema gritante no git que "checkout -f" realmente não força um novo checkout. Outra solução seria remover todos os arquivos da cópia de trabalho primeiro (ou seja, tudo menos o .git dir).
falcão
Ah, sim, obrigado por isso! Ouvindo isso, suponho que poderíamos simplesmente remover os arquivos de interesse e executar a verificação. Para mim, havia apenas um arquivo que eu estava tentando corrigir. Mas é claro que podem ser todos os arquivos, centenas ou milhares.
Jason
Isso falha no git 1.8.3 (mac) com: erro: pathspec 'HEAD ^' não corresponde a nenhum arquivo conhecido pelo git.
dval de
@dval, olhe as edições deste post e você verá uma maneira alternativa de fazer isso. Estou executando em um Mac também, e isso funcionou para mim. Eu também encorajo você a atualizar seu git para 2+ e você pode usar o Homebrew para fazer isso de uma maneira segura e sustentável.
Jason
2
Isso realmente não funciona. O GIT atualizará apenas arquivos que mudaram entre os dois commits (com algumas exceções). Se um repositório for novo, por exemplo. apenas dois commits e o primeiro está vazio, então esta solução funcionará. Caso contrário, você precisará excluir à força todos os arquivos conforme descrito pela resposta de mechsin.
jstine
16

Como outros apontaram, pode-se simplesmente deletar todos os arquivos do repositório e depois fazer o check-out. Eu prefiro este método e pode ser feito com o código abaixo

git ls-files -z | xargs -0 rm
git checkout -- .

ou uma linha

git ls-files -z | xargs -0 rm ; git checkout -- .

Eu uso o tempo todo e não encontrei nenhum lado negativo ainda!

Para obter mais explicações, o -zanexa um caractere nulo ao final de cada entrada de saída por ls-filese -0diz xargspara delimitar a saída que estava recebendo por esses caracteres nulos.

mechsin
fonte