Problema do chmod do Git: Check-out dos parafusos do bit exec

Problema do chmod do Git: Check-out dos parafusos do bit exec

No Ubuntu e no Debian, os últimos arquivos confirmados recebem o bit de execução definido, quando tento fazer o checkout posteriormente. É muito 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 ideia de quando e por que a parte de execução ocorre? core.filemodeestá configurado para true.

Eu tenho o arquivo aberto no vim durante a troca de ramificação, se isso for importante de alguma forma.

Adendo 1:É o checkout, onde as permissões são bagunçadas. 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:A propósito, isso acontece para cada arquivo neste repositório que eu submeto. Após o commit bem-sucedido, não posso mudar de branch sem a permissão errada.

Responder1

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

Isso significa que uma vez você configurou o arquivo como executável, que o Git pegou e replicou no repositório. Portanto, você deve alterar a máscara de permissão do arquivo antes de enviar.

Para fazer o Git ignorar tais mudanças, use

git config core.filemode false

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

Responder2

Você verificou se existe um gancho personalizado executado durante o commit ou checkout? Pode haver alguns ganchos personalizados adulterando seus arquivos. Confira apágina de manual do gitooks.

Hooks são basicamente pequenos programas chamados pelo git em determinados eventos (commit, checkout etc.).

Responder3

você já tentou git commit -m 'mode is 644' file no branch dev-branch

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

Responder4

Existem boas respostas nesses links.

https://stackoverflow.com/questions/9027584/how-to-change-the-file-mode-on-github

e

https://stackoverflow.com/questions/1611211/how-do-i-make-git-accept-mode-changes-without-accepting-all-text-changes

Essencialmente, você precisa git update-index --chmod=(+|-)x <file>e isso adicionará uma alteração que você precisará confirmar e enviar para que as permissões sejam adicionadas/removidas.

informação relacionada