Problema com o chmod do Git: parafusos de verificação geral exec bit

10

No Ubuntu e Debian, os últimos arquivos confirmados estão sendo definidos como bits de execução, quando eu tento fazer um checkout depois. É bem estranho e me deixa louco:

$ ls -l file
-rw-r--r-- ... file

# on branch master:
$ git commit -m 'mode is 644' file
[master 0123456] mode is 644
 1 files changed, 1 insertions(+), 1 deletions(-)
# All ok

$ git checkout dev-branch
Switched to branch 'dev-branch'
# Seemingly all ok, but file now has the exec bit set

$ git merge master
Updating 6543210..0123456
error: Your local changes to 'file' would be overwritten by merge.  Aborting.
Please, commit your changes or stash them before you can merge.
# Oops...

$ ls -l file
-rwxr-xr-x ... file

Alguém tem uma idéia, quando e por que o bit de execução entra? core.filemodeestá definido para true.

Tenho o arquivo aberto no vim durante a alternância de ramificação, se isso é importante de alguma forma.

Adendo 1: é o checkout, onde as permissões estão erradas. Eu posso jogar o jogo sem parar:

$ git br
* master
  dev-branch

$ git diff
diff --git a/file b/file
old mode 100644
new mode 100755

$ chmod 644 file

$ git diff

$ git checkout dev-branch

$ git diff
diff --git a/file b/file
old mode 100644
new mode 100755

$ chmod 644 file

$ git diff

$ git checkout master

$ git diff
diff --git a/file b/file
old mode 100644
new mode 100755

# ...and so on ad inf.

Adendo 2: Isso acontece, a propósito, para todos os arquivos deste repositório que eu confirmo. Após a confirmação bem-sucedida, não posso trocar de ramificação sem a permissão necessária.

Boldewyn
fonte
Você verificou as permissões na etapa #seemingly tudo ok ...
RobotHumans
Eu concordo aqui. No ramo dev, 'git-log master ... HEAD - file' e veja se alguma coisa mudou entre o ramo e agora nesse arquivo.
Yuriismaster
@ aking1012: Sim, nesse ponto os modos de arquivo já foram alterados. Vou atualizar a pergunta.
Boldewyn
@yuriismaster: git-logmostra nenhuma saída em tudo, pois nem combinação de master, dev-branchou HEAD(? o que é estranho, não é não deve o comando imprimir a última mensagem de confirmação de master?)
Boldewyn
2
Em que sistema de arquivos você está?
bitmask

Respostas:

12

Não é um usuário do Git, mas acredito que o Git armazena toda a máscara de permissão de arquivo.

Isso significa que você definiu o arquivo como executável, que o Git selecionou e replicou no repositório. Portanto, você deve alterar a própria máscara de permissão do arquivo antes de confirmar.

Para fazer o Git ignorar essas alterações, use

git config core.filemode false

No git-config (1) :

   core.fileMode
       If false, the executable bit differences between the index and the
       working copy are ignored; useful on broken filesystems like FAT.
       See git-update-index(1). True by default.
harrymc
fonte
11
Na verdade, tento confirmar os arquivos com as permissões corretas. Até reenviei todos os arquivos depois de modificá-los. Desde que eu trabalho no Windows de tempos em tempos (não com este repositório), eu sei core.fileMode, mas esperava poder sair dele true.
Boldewyn
Pode até ser um bug no git ao trabalhar no que eles chamam de "sistemas de arquivos quebrados". Não há sistemas de arquivos danificados, apenas software danificado.
harrymc
4
Eu tenho que concordar com os desenvolvedores git que a gordura é quebrada
RobotHumans
3
OK, era o sistema de arquivos. Não consegui reproduzi-lo em outra máquina, onde o diretório é montado via NFS. Na máquina principal, é, como eu disse, CIFS. Quando perguntei na lista de correspondência do git, recebi a resposta, que o CIFS está quebrado quanto aos bits de execução. Droga!
Boldewyn
3

Você verificou se há um gancho personalizado executado durante a confirmação ou a finalização da compra? Pode haver alguns ganchos personalizados adulterando seus arquivos. Confira a página de manual do githooks .

Hooks são basicamente pequenos programas chamados pelo git em determinados eventos (confirmação, check-out etc.).

bandi
fonte
Boa tentativa, mas meu .git/hooksdiretório está intocado.
Boldewyn
1

você tentou o arquivo git commit -m 'mode is 644' no branch dev-branch

para mim, parece que o que está acontecendo é que você está alterando as permissões no main e, em seguida, puxando para baixo o ramo dev que tem a permissão errada, impedindo sua permissão local. depois tentando cometer novamente. clonar, alterar, confirmar, mesclar; ou tente alterar o arquivo individualmente com um único arquivo consolidado em dev e depois mesclar

RobotHumans
fonte
11
Na verdade, nunca toco em permissões no cenário original. Toda mudança de permissão é feita pelo git na etapa 'checkout'.
Boldewyn
... ou seja, eu fiz alguma coisa chmodnos arquivos, mas infelizmente não me lembro se o problema começou a ocorrer logo depois. Eu acho que não.
Boldewyn
i tentou replicar o seu problema e eu não posso
RobotHumans
Isso ocorre porque você não trabalha em um CIFS montado ;-). Esqueci o +1 na tentativa, obrigado!
Boldewyn