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.filemode
está 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.
git-log
mostra nenhuma saída em tudo, pois nem combinação demaster
,dev-branch
ouHEAD
(? o que é estranho, não é não deve o comando imprimir a última mensagem de confirmação demaster
?)Respostas:
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
No git-config (1) :
fonte
core.fileMode
, mas esperava poder sair deletrue
.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.).
fonte
.git/hooks
diretório está intocado.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
fonte
chmod
nos arquivos, mas infelizmente não me lembro se o problema começou a ocorrer logo depois. Eu acho que não.Existem boas respostas nesses links.
/programming/9027584/how-to-change-the-file-mode-on-github
e
/programming/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.fonte