Como faço para remover arquivos que dizem "modo antigo 100755 novo modo 100644" de alterações não estágios no Git?


723

Por alguma razão, quando inicialmente fiz um puxão do repositório para um projeto git meu, recebi uma tonelada de arquivos em minha cópia de trabalho que não fizeram alterações discerníveis, mas continuam aparecendo na minha unstaged changesárea.

Estou usando o Git Gui no Windows xp e quando vou ver o arquivo para ver o que mudou. Tudo o que vejo é:

old mode 100755  
new mode 100644  

Alguém sabe o que isso significa?

Como posso obter esses arquivos da minha lista de alterações sem etapas? (Muito chato ter que passar por centenas de arquivos, apenas para escolher os arquivos que eu editei recentemente e quero confirmar).

Respostas:


1286

Parece-me modos de permissões de arquivo unix para mim ( 755= rwxr-xr-x, 644= rw-r--r--) - o modo antigo incluía o sinalizador + x (executável), o novo modo não.

As respostas deste problema do msysgit sugerem definir core.filemode como false para se livrar do problema:

git config core.filemode false

132
+1. Isso significa que o git pensa que pode definir corretamente o bit executável nos arquivos com check-out, mas quando tenta fazer isso não funciona (ou pelo menos não da maneira que pode ler). Quando volta a ler o status desses arquivos, parece que o bit executável foi deliberadamente desabilitado. Definir core.filemode como false diz ao git para ignorar quaisquer alterações de bits executáveis ​​no sistema de arquivos, para que não veja isso como uma alteração. Se você precisar preparar uma mudança de bit executável, isso significa que você deve fazer manualmente git update-index --chmod=(+|-)x <path>.
CB Bailey

7
Se, como eu, as alterações de modo forem importantes, você poderá definir core.filemode como false, confirmar suas alterações reais de código e, em seguida, definir core.filemode como true e o git preservará as alterações no arquivo.
22710 Michael T. Smith

8
Eu tenho o mesmo problema, mas foi devido ao uso do mesmo git repro via linha SSH git cmd e pelas extensões Git em uma unidade mapeada no Windows! . . Solução foi a mesma, adicionados a "configuração" [núcleo] fileMode = falso
Ian Vaughan

2
Isso foi um salva-vidas, obrigado senhor! Isso aconteceu comigo no OSX, depois que compartilhei um repositório clonado na pasta pública e alterei as permissões dos arquivos.
Thiago Ganzarolli

8
@robsch Você pode usar git config --global ...para definir a opção no seu arquivo de configuração global.
Âmbar

98

Definir core.filemodecomo false faz o trabalho, mas certifique-se as configurações em ~/.gitconfignão estão sendo substituídas por aqueles no .git/config.


3
Estive lá, fiz isso. Infelizmente, encontrei seu comentário somente depois de ter resolvido o problema. Ainda assim, +1!
David Schmitt

1
Se outros usuários estiverem clonando este projeto no Windows, talvez seja melhor aplicar a alteração ao ~/.gitconfigarquivo!
Ian Vaughan

Se você deseja verificar o Windows Powershell. git config --list --show-origin | sls filemodeou no Linux git config --list --show-origin | grep filemode. Isso mostrará onde você precisa fazer os ajustes.
Frank Fu

Você acertou em cheio !! Bem feito.
Kim

27

Encontrei esse problema ao copiar um repositório Git com arquivos de trabalho de um disco rígido antigo algumas vezes. O problema decorre do fato de o proprietário e as permissões terem mudado da unidade / máquina antiga para a nova. Por muito tempo, execute os seguintes comandos para corrigir as coisas ( graças a esta resposta do superusuário ):

sudo chmod -R -x . # remove the executable bit from all files

O comando anterior realmente resolverá as diferenças relatadas pelo git diff, mas revogará sua capacidade de listar os diretórios, por isso ls ./falhará ls: .: Permission denied. Para corrigir isso:

sudo chmod -R +X . # add the executable bit only for directories

A má notícia é que, se você possui algum arquivo que deseja manter executável, como .shscripts, precisará revertê-los. Você pode fazer isso com o seguinte comando para cada arquivo:

chmod +x ./build.sh # where build.sh is the file you want to make executable again

2
Obrigado, me ajudou muito! Deve-se também verificar se git config core.filemodeestá definido como true, caso contrário, as alterações de permissão não serão detectadas. Eu também precisava atualizar o índice git após cada alteração para buscá-lo.
-

Esta solução é a mais segura se você estiver preocupado com as dependências afetadas.
Jin

9

Geralmente acontece quando o repositório é clonado entre máquinas Windows e Linux / Unix.

Apenas diga ao git para ignorar a alteração do modo de arquivo, aqui estão várias maneiras:

  1. Configure SOMENTE para o repo atual:

    git config core.filemode false
    
  2. Configure globalmente:

    git config --global core.filemode false
    
  3. Adicione ~ / .gitconfig:

    [core]
         filemode = false
    

Basta selecionar um deles.


Configuração global não funciona porque (eu acho) git cria um repo com esta opção definida como true (Eu criei um repo em linux)
Herrgott

4

Parece que você alterou algumas permissões do diretório. Eu executei as seguintes etapas para restaurá-lo.

$  git diff > backup-diff.txt                ### in case you have some other code changes 

$  git checkout .

3

Você pode tentar git reset --hard HEAD para redefinir o repo para o estado padrão esperado.


8
Se o git não foi capaz de definir o bit executável corretamente / consistentemente após um pull, não será melhor após um reset.
CB Bailey

2
Mudei alguns projetos para um drive USB (fat32) e de volta para minha máquina ubuntu (ext4) e acabei com um monte de arquivos alterados, bem, os atributos. git reset --hard HEADfuncionou perfeitamente para mim. graças
cirovladimir

7
-1. O OP afirma "apenas para selecionar os arquivos que eu editei recentemente e quero confirmar". Isso removeria essas edições também.
whitfin

9
-1 Sugerir este comando no git é semelhante a dizer "você pode apenas rm -rf ./, tenho certeza de que não terá consequências indesejadas".
Kzqai

1
Não, isso não ajuda e este é o problema. Você redefine e limpa, e ainda o status git está mostrando as alterações de modo. Este é um problema sério com o Windows Git e acho que deve ser corrigido, não apenas contornando o modo de arquivo.
vezenkov 31/08


1

Isso acontece quando você puxa e todos os arquivos foram executáveis ​​no repositório remoto. Torná-los executáveis ​​novamente fará com que tudo volte ao normal novamente.

chmod +x <yourfile> //For one file
chmod +x folder/* // For files in a folder

Você pode precisar fazer:

chmod -x <file> // Removes execute bit

em vez disso, para arquivos que não foram definidos como executáveis ​​e que foram alterados devido à operação acima. Existe uma maneira melhor de fazer isso, mas isso é apenas uma correção muito rápida e suja.


1

Você pode usar o seguinte comando para voltar ao modo de arquivo. git add --chmod=+x -- filename Em seguida, comprometa-se com o ramo.


0

Eu tinha apenas um arquivo problemático com as permissões alteradas. Para revertê-lo individualmente, apenas o excluí manualmente rm <file>e, em seguida, fiz um checkout para obter uma nova cópia.

Felizmente eu ainda não o havia encenado.

Se tivesse, poderia ter corrido git reset -- <file>antes de corrergit checkout -- <file>


0

Eu acabei de encontrar esse problema ao diferenciar meu ramo com o mestre. O Git retornou um erro de 'modo' quando eu esperava que meu ramo fosse idêntico ao mestre. Corrigi o problema excluindo o arquivo e depois mesclando o master novamente.

Primeiro, executei o diff:

git checkout my-branch
git diff master

Isso retornou:

diff --git a/bin/script.sh b/bin/script.sh
old mode 100755
new mode 100644

Em seguida, executei o seguinte para corrigir:

rm bin/script.sh
git merge -X theirs master

Depois disso, git diffnão retornou diferenças entre meu ramo e mestre.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.