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.filemode
está 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
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
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.