soft - git tag remote




Alterações não organizadas deixadas após o reset do git--hard (13)

O título diz tudo.

Depois de git reset --hard , o git status me fornece arquivos dentro da seção Changes not staged for commit:

Eu também tentei git reset . git checkout -- . e git checkout-index -f -a , sem sucesso.

Então, como posso me livrar dessas mudanças não organizadas?

Isso parece atingir apenas os arquivos de projeto do Visual Studio. Esquisito. Veja esta pasta: http://pastebin.com/eFZwPn9Z . O que é especial com esses arquivos, é que em .gitattributes eu tenho:

*.sln        eol=crlf
*.vcproj     eol=crlf
*.vcxproj*   eol=crlf

Além disso, autocrlf é definido como false no meu global .gitconfig . Isso poderia ser de alguma forma relevante?


Possível causa # 1 - normalização de término de linha

Uma situação na qual isso pode acontecer é quando o arquivo em questão foi verificado no repositório sem a configuração correta para fins de linha (1), resultando em um arquivo no repositório com os finais de linha incorretos ou finais de linha mistos. Para confirmar, verifique se o git diff mostra apenas alterações nos finais de linha (eles podem não estar visíveis por padrão, tente git diff | cat -v para ver retornos de carro como caracteres literais ^M ).

Posteriormente, alguém provavelmente adicionou um .gitattributes ou modificou a configuração core.autocrlf para normalizar os finais de linha (2). Com base nos .gitattributes ou global, o Git aplicou as alterações locais em sua cópia de trabalho que aplicam a linha que termina com a normalização solicitada. Infelizmente, por algum motivo git reset --hard não desfaz essas alterações de normalização de linha.

Solução

Soluções alternativas nas quais os finais de linha locais são redefinidos não resolverão o problema. Toda vez que o arquivo é "visto" pelo git, ele tentará e reaplicará a normalização, resultando no mesmo problema.

A melhor opção é permitir que git aplique a normalização .gitattributes normalizando todos os finais de linha no repo para corresponder aos .gitattributes , e confirmando essas mudanças - veja Tentando consertar terminações de linha com git filter-branch, mas não tendo sorte .

Se você realmente quer tentar reverter as mudanças no arquivo manualmente, a solução mais fácil parece ser apagar os arquivos modificados, e então dizer ao git para restaurá-los, embora eu note que essa solução não parece funcionar consistentemente em 100% dos arquivos. o tempo ( ATENÇÃO: NÃO execute isto se seus arquivos modificados tiverem outras mudanças que não finais de linha !!):

    git status --porcelain | grep "^ M" | cut -c4- | xargs rm
    git checkout -- .

Observe que, a menos que você normalize os términos de linha no repositório em algum momento, você continuará correndo nesse problema.

Possível causa # 2 - Insensibilidade do caso

A segunda causa possível é a insensibilidade a maiúsculas e minúsculas no Windows ou no Mac OS / X. Por exemplo, digamos que um caminho como o seguinte exista no repositório:

/foo/bar

Agora alguém no Linux envia arquivos para /foo/Bar (provavelmente devido a uma ferramenta de compilação ou algo que criou esse diretório) e envia. No Linux, isso é na verdade dois diretórios separados:

/foo/bar/fileA
/foo/Bar/fileA

Marcar esse repo no Windows ou Mac pode resultar em fileA modificadoA que não pode ser redefinido, porque em cada redefinição, git no Windows verifica /foo/bar/fileA e, em seguida, porque o Windows não diferencia maiúsculas de minúsculas, sobrescreve o conteúdo de fileA com /foo/Bar/fileA , resultando em eles serem "modificados".

Outro caso pode ser um arquivo individual existente no repositório, que, quando registrado em um sistema de arquivos insensível a maiúsculas, se sobreporia. Por exemplo:

/foo/bar/fileA
/foo/bar/filea

Pode haver outras situações semelhantes que possam causar tais problemas.

O git em sistemas de arquivos insensíveis a maiúsculas e minúsculas deve realmente detectar essa situação e mostrar uma mensagem de aviso útil, mas atualmente não (isso pode mudar no futuro - veja esta discussão e os patches propostos relacionados na lista de discussão git.git).

Solução

A solução é colocar o caso de arquivos no índice git e no case no sistema de arquivos do Windows em alinhamento. Isso pode ser feito no Linux, que mostrará o verdadeiro estado das coisas, ou no Windows, com o utilitário de código aberto Git-Unite . O Git-Unite aplicará as mudanças de caso necessárias ao índice do git, que pode então ser confirmado no repo.

(1) Isso era mais provável para alguém que usa o Windows, sem qualquer definição de .gitattributes para o arquivo em questão, e usando a configuração global padrão para core.autocrlf que é false (veja (2)).

(2) http://adaptivepatchwork.com/2012/03/01/mind-the-end-of-your-line/


Se outras respostas não estiverem funcionando, tente adicionar os arquivos e, em seguida, redefina

$ git add -A
$ git reset --hard

No meu caso, isso ajudou quando havia um monte de arquivos vazios que o git estava rastreando.


RESOLVIDO!!!

Eu resolvi esse problema usando os seguintes stpes

1) Remova todos os arquivos do índice do Git.

git rm --cached -r .

2) Reescreva o índice Git para pegar todos os novos finais de linha.

git reset --hard

A solução fazia parte das etapas descritas no site git https://help.github.com/articles/dealing-with-line-endings/


Como outras respostas apontaram, o problema é por causa da correção automática de fim de linha. Eu encontrei este problema com arquivos * .svg. Eu usei o arquivo svg para ícones no meu projeto.

Para resolver este problema, deixei o git saber que os arquivos svg devem ser tratados como binários em vez de texto, adicionando a linha abaixo a .gitattributes

binário * .svg


Eu acertei um problema semelhante envolvendo também o .gitattributes , mas no meu caso envolvia o LFS do GitHub. Embora esse não seja exatamente o cenário do OP, acho que ele fornece uma oportunidade para ilustrar o que o arquivo .gitattributes faz e por que ele pode levar a alterações não sincronizadas na forma de diferenças "fantasmas".

No meu caso, um arquivo já estava no meu repositório, como desde o início dos tempos. Em uma confirmação recente, adicionei uma nova regra de git-lfs track usando um padrão que estava em retrospectiva um pouco amplo demais e terminando combinando com esse antigo arquivo. Eu sei que não queria mudar esse arquivo; Eu sei que não mudei o arquivo, mas agora foi em minhas alterações não organizadas e nenhuma quantidade de checkouts ou resets no arquivo iria consertá-lo. Por quê?

A extensão GitHub LFS funciona principalmente através da alavancagem dos ganchos que o git fornece acesso através do arquivo .gitattributes . Geralmente, as entradas em .gitattributes especificam como os arquivos correspondentes devem ser processados. No caso do OP, estava preocupado com a normalização das terminações de linha; no meu, era se o LFS deveria lidar com o armazenamento de arquivos. Em ambos os casos, o arquivo que o git vê ao calcular um git diff não corresponde ao arquivo que você vê quando inspeciona o arquivo. Portanto, se você alterar como um arquivo é processado por meio do padrão .gitattributes correspondente, ele será exibido como alterações não sincronizadas no relatório de status, mesmo que não haja realmente nenhuma alteração no arquivo.

Tudo o que disse, a minha "resposta" para a pergunta é que, se a alteração no arquivo .gitattributes é algo que você queria fazer, você deve realmente apenas adicionar as alterações e seguir em frente. Caso contrário, altere os .gitattributes para representar melhor o que você deseja fazer.

Referências

  1. GitHub LFS Specification - Grande descrição de como eles se conectam às chamadas de função clean e smudge para substituir seu arquivo nos objetos git por um arquivo de texto simples com um hash.

  2. gitattributes Documentation - Todos os detalhes sobre o que está disponível para personalizar como o git processa seus documentos.


Eu acredito que há um problema com o git para Windows, onde o git escreve aleatoriamente os finais de linha incorretos no checkout e a única solução é fazer o checkout de algum outro branch e forçar o git a ignorar as mudanças. Em seguida, finalize a ramificação na qual você realmente deseja trabalhar.

git checkout master -f
git checkout <your branch>

Esteja ciente de que isso irá descartar quaisquer alterações que você tenha feito intencionalmente, portanto, faça isso apenas se você tiver esse problema imediatamente após a finalização da compra.

Edit: Eu poderia ter realmente sorte na primeira vez. Acontece que eu morri novamente depois de trocar de galho. Descobriu-se que os arquivos que o git estava reportando como modificados depois de mudar as filiais estavam mudando. (Aparentemente, porque o git não estava aplicando consistentemente a linha CRLF terminando nos arquivos corretamente.)

Eu atualizei para o último git para o Windows e espero que o problema se foi.


Eu tive o mesmo problema. Eu fiz git reset --hard HEAD mas ainda toda vez que eu fiz git status eu estava vendo alguns arquivos como modificados.

Minha solução foi relativamente simples. Acabei de fechar meu IDE (aqui foi o Xcode) e fechar minha linha de comando (aqui era terminal no meu Mac OS) e tentei de novo e funcionou.

No entanto, nunca consegui descobrir o que originou o problema.


Execute o comando clean :

# Remove all untracked files and directories. (`-f` is `force`, `-d` is `remove directories`)

git clean -fd

O Git não irá redefinir arquivos que não estão no repositório. Então você pode:

$ git add .
$ git reset --hard

Isso fará com que todas as alterações sejam realizadas, o que fará com que o Git fique ciente desses arquivos e os redefina.

Se isso não funcionar, você pode tentar armazenar e descartar suas alterações:

$ git stash
$ git stash drop

Ok, resolvi o problema.

Parecia que o arquivo .gitattributes , contendo:

*.sln        eol=crlf
*.vcproj     eol=crlf
*.vcxproj*   eol=crlf

fez com que os arquivos do projeto parecessem não exibidos. Eu não tenho a menor ideia do porquê disso, e estou realmente esperando que alguém que tenha conhecimento das maneiras de ser gentil nos dê uma boa explicação.

Minha correção foi remover esses arquivos e adicionar autocrlf = false em [core] em .git/config .

Isto não equivale exatamente à mesma coisa que a configuração anterior, já que requer que cada dev tenha autocrlf = false . Eu gostaria de encontrar uma solução melhor.

EDITAR:

Eu comentei as linhas incriminatórias, não as comentei e funcionou. O que o ... eu nem sequer ...!


Outra possibilidade que eu encontrei foi que um dos pacotes no repositório acabou com um HEAD separado. Se nenhuma das respostas aqui ajudar e você encontrar uma mensagem de status git como essa, você pode ter o mesmo problema:

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

        modified:   path/to/package (new commits)

Indo para a pasta path/to/package um git status deve render o seguinte resultado:

HEAD detached at 7515f05

E o seguinte comando deve então corrigir o problema, onde o master deve ser substituído pelo seu ramo local:

git checkout master

E você receberá uma mensagem informando que sua filial local terá algumas quantias de commits por trás da ramificação remota. git pull e você deve estar fora da floresta!


Problema semelhante, embora eu tenha certeza apenas na superfície. De qualquer forma, pode ajudar alguém: o que eu fiz (FWIW, no SourceTree): escondeu o arquivo não confirmado, então fez um hard reset.


Você pode stash suas alterações e, em seguida, descartar o estoque:

git stash
git stash drop






git-reset