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.


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.

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.).


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


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

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.