Atualizando e confirmando apenas as permissões de um arquivo usando o controle de versão git

187

Apenas transformou um some.sharquivo em um executável ( chmod 755 ...), as permissões foram atualizadas, mas não o conteúdo. Existe uma maneira de confirmar o arquivo no git, para que o bit executável seja restaurado / definido no clone / checkout / pull ?

Atualização: como posso acompanhar o envio das novas permissões github?

BreakPhreak
fonte

Respostas:

190

Por padrão, o git atualizará as permissões de execução de arquivo se você as alterar. Não irá alterar ou rastrear outras permissões.

Se você não vir nenhuma alteração ao modificar a permissão de execução, provavelmente terá uma configuração no git que ignora o modo de arquivo.

Olhe para o seu projeto, na .gitpasta do configarquivo e você verá algo parecido com isto:

[core]
    filemode = false

Você pode alterá-lo para trueno seu editor de texto favorito ou executar:

git config core.filemode true

Então, você poderá confirmar normalmente seus arquivos. Apenas confirmará as alterações de permissão.

Vincent B.
fonte
obrigado! como posso acompanhar o envio das alterações de permissão github?
BreakPhreak
2
Você pode vê-lo quando você visualizar um arquivo (por exemplo, no arquivo Rails gitignore , você vai encontrar 100644 como a permissão de arquivo)
Vincent B.
8
Fazer alterações de permissões no Windows com git (na verdade, alterar as permissões de arquivo e cometer): blog.lesc.se/2011/11/how-to-change-file-premissions-in-git.html
fooMonster
39
Esta resposta está errada! O Git rastreia apenas se um arquivo é executável ou não. Ele não rastreia outra permissão de arquivo, como gravável ou legível. Leia stackoverflow.com/a/11231682/2311074 para obter mais informações.
Adam
Para mim, o webstorm não percebeu a mudança, mas git statusvejo mudanças ..
Townsheriff 17/04
193

O artigo @fooMonster funcionou para mim

# git ls-tree HEAD
100644 blob 55c0287d4ef21f15b97eb1f107451b88b479bffe    script.sh

Como você pode ver, o arquivo tem permissão 644 (ignorando os 100). Gostaríamos de alterá-lo para 755:

# git update-index --chmod=+x script.sh

comprometer as mudanças

# git commit -m "Changing file permissions"
[master 77b171e] Changing file permissions
0 files changed, 0 insertions(+), 0 deletions(-)
mode change 100644 => 100755 script.sh
ewwink
fonte
7
Note-se que você realmente precisa usar '-x / + x'. Você não pode definir outras permissões ou uma máscara de bits.
Devolus 21/09
note que o uso git commit -anão fez nada por mim, mas a configuração da mensagem na linha de comando fez. Pouco de uma peculiaridade
JonnyRaa
A ordem de comando deve ser: # git update-index --chmod=+x script.sh # git ls-tree HEAD # git commit -m "Changing file permissions" # git push
SimonDepelchin 9/09/19
30

Não está trabalhando para mim.

O modo é verdadeiro, as permissões de arquivo foram alteradas, mas o git diz que não há trabalho a fazer.

git init
git add dir/file
chmod 440 dir/file
git commit -a

O problema parece ser que o git reconhece apenas certas alterações de permissão.

Otheus
fonte
51
Correto - gitrealmente apenas rastreia se um arquivo é executável ou não, não o conjunto completo de permissões * nix. Então você teria que mudar um arquivo entre / executável não para que ele acha que mudaram vale alguma coisa cometer ...
twalberg
Não consegui encontrar uma documentação clara: que gatilho pós-ação posso usar talvez para definir as permissões de acordo?
Otheus
2
Bem, existe um post-checkoutgancho git, que abrangeria alguns casos, mas não tenho certeza se isso abrangeria todas as coisas possíveis que atualizam arquivos na sua árvore de trabalho. Talvez seja melhor ter apenas um script de shell adicional em seu repositório que configure as coisas adequadamente. Como alternativa, há um par de projetos lá fora, que augment gitpara armazenar metadados, mas eu realmente nunca tentou qualquer um deles ...
twalberg
1
Mudei as permissões de arquivo para 777 e o fiz git update-index --refresh, mas o diff mostra old mode 100644 new mode 100755. Não atualizou todas as permissões
hudac
consulte a resposta @tishma aqui stackoverflow.com/questions/14557106/… . Isto é o que funcionou para mim
gary69