Aplicar automaticamente “git update-index –chmod = + x” para arquivos executáveis

Eu freqüentemente adiciono scripts bash ao meu repository git, e os scripts possuem permissions executáveis ​​no sistema de arquivos linux antes do git add . Mas depois de empurrar os arquivos adicionados para um repository remoto e puxar em outro local, os arquivos aparecem com permissions não executáveis. Parece haver duas maneiras de corrigir o problema:

 1. chmod u+x $script git commit -am "fixing the script permissions... again..." 

ou

 2. git update-index --chmod=+x $script 

Em vez de consertar as permissions todas as vezes, existe uma maneira de ter o git simplesmente olhando as permissions do arquivo no script durante o git add , reconhecendo que “hey, este aqui é um arquivo executável!” e adicioná-lo ao repository com as permissions exectuable diretamente?

Existem várias maneiras de fazer isso.

  1. Aliases do Git
  2. Aliases de bash
  3. Ou até mesmo combinar aliases bash e git
  1. Aliases do Git

    Você sempre pode usar o bash dentro do seu alias git.

    • Abra sua configuração do git:

      vim ~/.gitconfig

    • Adicione uma seção de aliases a ela (se não existir):

       [alias] addscr = !sh -c 'if [[ ${0: -3} == ".sh" ]]; then git update-index --chmod=+x $0; git add $0' 
  2. Aliases de bash

    • Edite seu arquivo de perfil bash:

      vim ~/.bashrc

    • Adicione isto no final do arquivo:

       function gitadd(){ if [[ ${1: -3} == ".sh" ]] then git update-index --chmod=+x $1 fi git add $1 } alias gitadd='gitadd' 
  3. Combina aliases de git e bash

    • Edite seu arquivo de perfil bash:

      vim ~/.bashrc

    • Adicione isto ao final do arquivo:

       function checkShellFile(){ return ${1: -3} == ".sh" } alias gitadd='checkShellFile ? git addsrcipt "$1" : && git add "$1"' 
    • Edite seu arquivo de configuração do git:

      vim ~/.gitconfig

    • Adicione uma seção de aliases a ela (se não existir):

       [alias] addscript = !sh -c 'git update-index --chmod=+x $0 && git add $0' 

Nenhuma das opções acima foi testada

git 2.9.X / 2.10 (Q3 2016) traz chmod para git add se!

Veja commit 4e55ed3 (31 de maio de 2016) por Edward Thomson ( ethomson ) .
Ajudado por: Johannes Schindelin ( dscho ) .
(Mesclado por Junio ​​C Hamano – gitster – em commit c8b080a , 06 de julho de 2016)

add : add --chmod=+x / --chmod=-x opções

O bit executável não será detectado (e, portanto, não será definido) para caminhos em um repository com core.filemode definido como false, embora os usuários ainda possam desejar adicionar arquivos como executáveis ​​para compatibilidade com outros usuários que tenham core.filemode funcionalidade.
Por exemplo, usuários do Windows que adicionam scripts de shell podem adicioná-los como executáveis ​​para compatibilidade com usuários em não-Windows.

Embora isso possa ser feito com um comando de encanamento ( git update-index --add --chmod=+x foo ), ensinar o comando git-add permite que os usuários definam um arquivo executável com um comando com o qual já estão familiarizados .

Você pode ver a origem deste novo recurso em ” Como criar permissions de modo de execução de arquivo no Git no Windows? ” (Fev. 2011)

Aqui está um script para aplicar automaticamente “git update-index – chmod + x” aos arquivos executáveis:

 for f in `find . -name '*.sh' -o -regex './s?bin/[^/]+' -o -regex './usr/sbin/[^/]+' -o -regex './usr/lib/[^/]+' `;do ( cd `dirname $f` && git update-index --chmod=+x `basename $f` ) done 

Uma solução sem script de fantasia :

  1. Defina fileMode = true em seu arquivo .git/config (ou executando git config core.filemode true como outros apontaram)
  2. Altere o bit executável nas permissions do arquivo e confirme essa alteração. ( chmod u+x $script como você apontou). Você só tem que fazer isso uma vez.
  3. Empurre para o controle remoto

Da próxima vez que você extrair de lá, o git configurará o bit executável confirmado no arquivo. Eu também tive problemas semelhantes, isso resolveu eles.

fileMode = true diz ao git para rastrear a única coisa sobre as permissions que ele pode: o bit executável. Isso significa que as alterações no bit executável serão reconhecidas pelo git como alterações na tree de trabalho e essas alterações serão armazenadas no repository com o seu próximo commit.

Uma vez que você tenha cometido o bit executável desejado, você também pode redefinir seu fileMode para false modo que, da próxima vez, o git não o incomode com essas mudanças quando você não quiser confirmá-las.

Eu não acho que isso pode ser feito no comando git add , mas você pode ser capaz de executar um script logo após executar o comando git commit , mas antes que o commit seja realmente criado.

Dê uma olhada no gancho pre-commit.

http://git-scm.com/book/en/Customizing-Git-Git-Hooks

Basicamente, basta criar um arquivo em sua pasta .git / hooks / chamada pré-commit. (Deve haver amostras já na pasta ganchos, renomeie-as para remover o “.sample” no final para ativar uma.)

Há uma pegadinha. Certifique-se de que seu script execute git stash -q primeiro para que você trabalhe nas versões dos arquivos em teste.