Arquivos exibidos como modificados diretamente após um clone do Git

227

Estou tendo um problema com um repositório no momento e, embora meu Git-fu seja geralmente bom, não consigo resolver esse problema.

Quando clono este repositório, cdem seguida, no repositório, git statusmostra vários arquivos conforme alterados. Nota: Eu não abri o repositório em nenhum editor ou qualquer coisa.

Tentei seguir este guia: http://help.github.com/dealing-with-lineendings/ , mas isso não ajudou em nada com o meu problema.

Eu tentei git checkout -- .muitas vezes, mas parece não fazer nada.

Estou em um Mac e não há submódulos no próprio repositório.

O sistema de arquivos é um sistema de arquivos "Journaled HFS +" no Mac e não faz distinção entre maiúsculas e minúsculas. Os arquivos são de uma linha e têm cerca de 79 KB cada (sim, você ouviu direito), portanto, analisar git diffnão é particularmente útil. Ouvi falar sobre o git config --global core.trustctime falseque pode ajudar, o que tentarei quando voltar ao computador com o repositório.

Mudei os detalhes do sistema de arquivos com os fatos! E eu tentei o git config --global core.trustctime falsetruque que não funcionou muito bem.

Sam Elliott
fonte

Respostas:

141

Eu tive o mesmo problema no Mac depois de clonar um repositório. Assumiria que todos os arquivos foram alterados.

Após a execução git config --global core.autocrlf input, ele ainda estava marcando todos os arquivos como alterados. Depois de procurar uma correção, deparei-me com o .gitattributesarquivo no diretório inicial que tinha o seguinte.

* text=auto

Eu comentei e quaisquer outros repositórios clonados a partir de agora estavam funcionando bem.

adnans
fonte
5
Obrigado! Finalmente achei isso depois de passar a noite toda alternando core.autocrlf e apply.whitespace. Isso funcionou. Obrigado.
Xer0x
5
A linha ofensiva em .gitattributes veio dos arquivos de pontos de Mathias Bynen , caso alguém mais se depare com isso.
SeanPONeil
31
alguém pode lançar mais luz sobre essa configuração específica? O que * text=autofaz? O que significa removê-lo .gitattributes? Vejo que isso corrige esse problema para mim, mas não sei por que isso ocorre, o que está realmente fazendo e quais os possíveis problemas que está criando.
Dennis
6
@Dennis Essa configuração ajuda a normalizar as terminações de linha, portanto, a exclusão provavelmente não é a resposta certa. Veja esta pergunta de resposta e este artigo . A resposta da @Arrowmaster abaixo foi mais útil para mim. Eu usei git adde git commitnormalizei o arquivo e me livrei do problema.
Jtpereyda
4
git config --global core.autocrlf inputconsertou para mim. Obrigado.
Dimiguel # 14/15
89

Deixa comigo. Todos os outros desenvolvedores estão no Ubuntu (eu acho) e, portanto, têm sistemas de arquivos que diferenciam maiúsculas de minúsculas. Eu, no entanto, não (como estou em um Mac). De fato, todos os arquivos tinham gêmeos em minúsculas quando os observei usando git ls-tree HEAD <path>.

Vou pegar um deles para resolver o problema.

Sam Elliott
fonte
Eles já resolveram isso? Possivelmente estou tendo o mesmo problema.
21412 Josh Johnson
8
Sim, peça a alguém com um sistema de arquivos com distinção entre maiúsculas e minúsculas que exclua todos, exceto um, de cada conjunto de arquivos que teriam nomes de arquivos duplicados em um sistema de arquivos que não diferencia maiúsculas de minúsculas.
Sam Elliott
1
Acabei de encontrar o mesmo problema desde a mudança do Ubuntu para o Mac. Obrigado, sua resposta atingiu a unha na cabeça. Espero que o voto positivo o empurre para a primeira posição. :-)
chmac
1
@Dirk é por isso que existem várias respostas. Aceitei o que se aplicava ao meu caso, o que não é irracional.
Sam Elliott
1
Esse também era meu problema - MacOS sem distinção entre maiúsculas e minúsculas. No entanto, git ls-tree HEAD <path>mostrou apenas um único arquivo. Pude ver os arquivos duplicados na interface do GitHub.com, no entanto, e também usá-la para excluir uma versão.
Orion elenzil 17/04/19
74
git config core.fileMode false

resolveu esse problema no meu caso

https://git-scm.com/docs/git-config

TL; DR;

core.fileMode

Se falso, as diferenças de bits executáveis ​​entre o índice e a árvore de trabalho são ignoradas; útil em sistemas de arquivos quebrados como o FAT. Veja git-update-index (1).

O padrão é true, exceto que o git-clone (1) ou o git-init (1) analisará e definirá core.fileMode false, se apropriado, quando o repositório for criado.

Piotr Korlaga
fonte
2
Mas o que isso faz?
Siwel 20/09/16
1
Eu também gostaria de saber o que isso faz, porque funcionou para mim também.
Donato
2
Quando o fiz git diff, descobri que as alterações estavam apenas no modo de arquivo. git pega em chmod -R 777 .que foi causado quando eu corri meu projeto e esta configuração permitiu-me a ignorar as mudanças chmod por git stackoverflow.com/q/1580596/6207775
Ayushya
1
O link está quebrado ( "Desculpe, não conseguimos encontrar seus kernels" ).
Peter Mortensen
O restante das respostas não funcionou, mas isso fez a mágica!
Conheça Patel
53

Presumo que você esteja usando o Windows. Essa página do GitHub a que você vinculou tem os detalhes ao contrário. O problema é que as terminações de linha CR + LF já foram confirmadas no repositório e porque você tem core.autocrlf definido como true ou input , o Git deseja converter as terminações de linha em LF, o que git statusmostra que todos os arquivos foram alterados.

Se este é um repositório que você deseja acessar apenas, mas não tem envolvimento, execute o seguinte comando para apenas ocultar o problema sem realmente resolvê-lo.

git config core.autocrlf false

Se este é um repositório no qual você estará envolvido ativamente e poderá confirmar alterações. Você pode resolver o problema executando uma confirmação que altera todas as terminações de linha no repositório para usar LF em vez de CR + LF e, em seguida, tomar medidas para impedir que isso aconteça novamente no futuro.

O seguinte é obtido diretamente da página do manual gitattributes e deve ser pré-formado a partir de um diretório de trabalho limpo.

echo "* text=auto" >>.gitattributes
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"

Se algum arquivo que não deve ser normalizado aparecer git status, desmarque o atributo de texto antes de executar git add -u.

manual.pdf      -text

Por outro lado, os arquivos de texto que o Git não detecta podem ter a normalização ativada manualmente.

weirdchars.txt  text
Arrowmaster
fonte
8
Eu não estou usando o Windows.
Sam Elliott
1
Por padrão, em sistemas não Windows, core.autocrlf está definido como false. Portanto, você não deveria ter enfrentado esse problema se for causado por terminações de linha. Você poderia fornecer mais detalhes sobre sua configuração específica, como o que é git diffmostrado para os arquivos que git statusdizem serem modificados, e também o sistema de arquivos que você está usando?
Arrowmaster
atualizou a pergunta com respostas para essas perguntas. Analisará todos os detalhes em um ou dois segundos. Não estou certo do que outros membros da equipe de desenvolvimento está usando
Sam Elliott
Foi isso que funcionou para nós ( git config core.autocrlf falsefoi suficiente). Fomos enganados pelo fato de o cliente estar executando no Linux (SL / RHEL), mas a sessão do Linux é iniciada via x2go a partir de um host do Windows. Portanto, essa pode ser a solução mais provável em um contexto homogêneo do Win + Lin.
Dirk
37

Por favor, execute os seguintes comandos. Isso pode resolver o problema.

# Remove everything from the index.
git rm --cached -r .

# Write both the index and working directory from git's database.
git reset --hard
kds
fonte
Nenhuma das outras soluções funcionou para mim, mas esta me colocou de volta em funcionamento.
rainabba
1
Eu tentei este e funcionou para mim. Obrigado Sr. LIama!
9117 Danniel Little
Isso piora meu repositório. Em um ramo que não tinha alterações, eu tinha 277 depois de executá-lo. Eu tive essas mesmas alterações em outros ramos para os quais mudei também. Corra com cuidado. Acabei de reclonar por repo e tenho 615 arquivos modificados. :(
Programador Paul
isso funcionou para mim usando o git v2.7.4 com ubuntu (WSL), Git para Windows v2.18.0.windows.1 e posh-git Eu sempre tive autocrlf false e o problema foi iniciado no Git for Windows e no posh-git após a atualização para 2.18.0 hoje
Jim Frenette
Estou surpreso que isso funcione. Obrigado pela ajuda. Para outros indo por este caminho, os arquivos que foram modificados aparentemente eram todos .png e .bmp geridos por LFS git
David Casper
16

No Visual Studio, se você estiver usando o Git, poderá gerar automaticamente os arquivos .gitignore e .gitattributes. O arquivo .getattributes gerado automaticamente tem a seguinte linha:

* text=auto

Esta linha está próxima ao topo do arquivo. Nós só precisamos comentar a linha adicionando um # na frente dela. Depois de fazer isso, as coisas funcionaram como esperado.

J Adam Rogers
fonte
1
Obrigado, estive lutando com isso por aaaages
Andrew Berry
Este foi exatamente o meu problema. Outro desenvolvedor usou o GIT através do VS em vez da CLI e criou esse arquivo .gitattributes.
Josh Maag
12

O problema também pode surgir de diferentes permissões de arquivo , como foi o meu caso:

Repositório clonado fresco (Windows, Cygwin):

$ git ls-tree HEAD
100755 blob 8099ea496a2c78d71125d79a05855f60ebf07904    testfile
   ↑↑↑

Repositório remoto nu (Linux):

$ git ls-tree HEAD
100644 blob 8099ea496a2c78d71125d79a05855f60ebf07904    testfile
   ↑↑↑
Gima
fonte
5

Eu queria adicionar uma resposta mais direcionada a "Por que" isso acontece, porque já existe uma boa resposta sobre como corrigi-lo.

Portanto, .gitattributestem uma * text=autoconfiguração que causa esse problema.

No meu caso, os arquivos no ramo mestre do GitHub tinham \r\nfinais. Eu disquei as configurações no repositório para fazer check-in com \nfinais. Eu não sei o que o Git verifica, no entanto. Ele deveria fazer check-out com finais nativos na minha caixa do Linux ( \n), mas acho que ele fez check-out do arquivo com \r\nfinais. O Git reclama porque vê as \r\nterminações com check-out que estavam no repositório e me avisa que fará o check-in nas \nconfigurações. Portanto, os arquivos devem "ser modificados".

Esse é o meu entendimento por enquanto.

Dennis
fonte
3

Eu tive o mesmo problema. Também com um Mac. Observando o repositório em uma máquina Linux, notei que tinha dois arquivos:

geoip.dat e GeoIP.dat

Eu removi o que estava obsoleto na máquina Linux e clonei o repositório novamente no Mac. Não pude extrair, confirmar, ocultar ou extrair da minha cópia do repositório quando havia duplicatas.

user2148301
fonte
3

O mesmo problema para mim. Eu pude ver várias imagens com o mesmo nome, como "textField.png" e "textfield.png" no repositório remoto do Git, mas não no meu repositório local. Eu só consegui ver "textField.png", que não foi usado no código do projeto.

Acontece que a maioria dos meus colegas está no Ubuntu usando o sistema de arquivos ext4, enquanto eu estou em um Mac usando o APFS.

Graças à resposta de Sam Elliott , a solução foi bastante simples. Primeiro, pedi a um colega no Ubuntu para excluir as versões redundantes de arquivos com letras maiúsculas, depois confirmar e pressionar remotamente.

Então eu executei o seguinte:

# Remove everything from the index.
git rm --cached -r .

# Write both the index and working directory from git's database.
git reset --hard

Por fim, decidimos que todo desenvolvedor deve alterar sua configuração do Git para impedir que isso aconteça novamente:

# Local Git configuration
git config core.ignorecase = true

ou

# Global Git configuration
git config --global core.ignorecase = true
Adrian
fonte
Seria melhor se você apenas respondesse aupvoted @ kds !
Elharony
Parece que o comando da linha de comando não deve ter o sinal de igual ( =) porque ele terminará no ignorecase = =arquivo de configuração.
Dmytro
1

Eu também tive o mesmo problema. No meu caso, eu clonei o repositório e alguns arquivos estavam imediatamente ausentes.

Isso foi causado pelo caminho para o arquivo e pelo nome de arquivo ser muito longo para o Windows. Para resolvê-lo, clone o repositório o mais próximo possível da raiz da unidade de disco rígido para reduzir o comprimento do caminho para o arquivo. Por exemplo, clone-o para em C:\A\GitRepovez de C:\Users Documents\yyy\Desktop\GitRepo.

8bitme
fonte
1

Edite o arquivo chamado .git/config:

sudo gedit .git/config

Ou:

sudo vim .git/config

Conteúdo

[core]
    repositoryformatversion = 0
    filemode = false
    bare = false
    logallrefupdates = true

[remote "origin"]
    url = [email protected]:DigitalPlumbing/unicorn-magento.git
    fetch = +refs/heads/*:refs/remotes/origin/*

[branch "master"]
    remote = origin
    merge = refs/heads/master

[branch "productapproval"]
    remote = origin
    merge = refs/heads/productapproval

Mude filemode=truepara filemode = false.

Pramod Kharade
fonte
Isso é equivalente agit config core.Filemode false
Guillermo Prandi
1

Para novas versões do macOS, isso pode ser causado por um recurso de segurança do sistema operacional.

No repositório em que eu estava trabalhando, havia um arquivo binário que tinha * .app como tipo de arquivo.

Foram apenas alguns dados serializados, mas o macOS trata todos os arquivos * .app como um aplicativo e, como esse arquivo não foi baixado pelo usuário, o sistema considerou-o inseguro e adicionou o com.apple.quarantineatributo file, garantindo que o arquivo não possa ser executado.

Mas definir esse atributo no arquivo também estava alterando o arquivo e, portanto, apareceu no conjunto de alterações do Git sem nenhuma maneira de revertê-lo.

Você pode verificar se você tem o mesmo problema executando $ xattr file.app.

A solução é bastante simples, desde que você não precise trabalhar com o arquivo. Basta adicionar *.app binaryao seu .gitattributes.

Lukas Zech
fonte
0

Copiei meu repositório local para outra pasta e um monte de arquivos modificados apareceu. Minha solução alternativa foi: eu escondi os arquivos modificados e excluí o esconderijo . O repositório ficou limpo.

Oleg Shvetsov
fonte
0

Eu descobri que o Git estava tratando meus arquivos (.psd nesse caso) como texto. A configuração para um tipo binário nos atributos .gitat resolveu.

*.psd binary
Lanny
fonte
0

Eu estava tentando fazer uma nova análise interativa, mas alegava que havia alguns arquivos modificados, por isso não me deixou fazê-lo agora. Tentei de tudo para voltar a um repositório limpo, mas nada funcionou. Nenhuma das outras respostas ajudou. Mas isso finalmente funcionou ...

git rm -rf the-folder-with-modified-stuff
git ci -m 'WAT'

Estrondo! Repositório limpo. Problema resolvido. Depois, tive que abandonar o último commit quando fiz o meu rebase -ie, finalmente, tudo estava limpo novamente. Bizarro!

Thomas Aylott
fonte
0

No caso de ajudar alguém, pode haver outra causa para esse problema: versões diferentes do Git. Eu estava usando a versão padrão instalada do Git em uma caixa do Ubuntu 18.04 (Bionic Beaver) e tudo estava funcionando bem, mas ao tentar clonar o repositório usando o Git no Ubuntu 16.04, alguns arquivos estavam aparecendo como modificados.

Nenhuma das outras respostas aqui resolveu meu problema, mas a atualização das versões do Git para corresponder nos dois sistemas resolveu o problema.

Todd Chaffee
fonte
1
Seria útil (e interessante) saber quais versões do git não estavam se saindo bem juntas.
jpaugh