Avisa antes de se comprometer acidentalmente com '-a'?

0

Eu geralmente me comprometo com git commit -a . Então, novamente, às vezes eu coloco arquivos individuais com git add e confirmo sem -a . Quando não tomo cuidado, acontece que eu digito -a por acidente quando preparei uma área de preparo meticulosamente preparada para o meu próximo commit, que então terei de reciclar se estiver falando sério sobre manter mudanças distintas em commits separados.

Existe uma maneira de evitar isso? O ideal seria que o git perguntasse sobre (ou recusasse categoricamente) a opção -a se (e somente se) algumas alterações já estivessem em etapas. Acho que deveria haver uma configuração para isso, mas não consegui encontrá-lo ...

    
por Raphael Schweikert 03.09.2018 / 19:53

1 resposta

1

Unix abordagem aqui.

Você não precisa do git support para receber um aviso simples. Você pode escrever um script wrapper ou uma função shell que examinará os parâmetros da linha de comando e tomará as medidas necessárias.

Esta função deve funcionar em bash (adicione ao seu .bashrc talvez) ou mesmo em sh .

git() {
   local found
   found=0
   for option; do
      if [ "$option" = "-a" ]; then found=1; break; fi
   done
   if [ "$found" -eq 1 ]
   then
      read -p "Option \'-a' detected. Please confirm with capital Y:" -r key
      [ "$key" != "Y" ] && return 254
   fi
   command git "$@"
}

Como alternativa, um script em vez de uma função:

#!/bin/sh

found=0
for option; do
   if [ "$option" = "-a" ]; then found=1; break; fi
done
if [ "$found" -eq 1 ]
then
   read -p "Option \'-a' detected. Please confirm with capital Y:" -r key
   [ "$key" != "Y" ] && return 254
fi
exec "/full/path/to/git" "$@"

Nomeie o script git , torne-o executável e coloque-o em um diretório que esteja no seu $PATH antes do diretório com o% realgit. $HOME/bin pode ser o lugar certo; meu Debian ainda fornece .profile (via /etc/skel/.profile ) que adiciona este caminho para PATH automaticamente (se o diretório existir). Lembre-se de que qualquer ferramenta (por exemplo, um script) que dependa de $PATH para chamar git chamará seu script de wrapper a partir de agora. Você pode não querer isso. Em caso afirmativo, use a abordagem da função shell.

Todo o procedimento é uma prova de conceito, pode ser sub-ótimo. Ele ainda não se importa com a sua condição "se (e somente se) algumas alterações já tiverem sido". Não estou familiarizado com git , mas acredito que esta resposta forneça uma maneira de verificar isso:

git diff --cached

Use-o para expandir a lógica da sua função ou script. Lembre-se de que você precisa de /full/path/to/git para evitar que seu script se chame e fique preso em um loop (como uma bifurcação sem forking, uma chain bomb). A função deve usar /full/path/to/git ou command git pela mesma razão.

Você também pode querer substituir [ "$option" = "-a" ] por algo como

[[ "$option" =~ ^-[a-zA-Z0-9]*a[a-zA-Z0-9]* ]]

para cobrir casos em que a é fornecido com outros comutadores de uma forma compacta (por exemplo, -Pa ). O comando [[ não é portátil .

    
por 04.09.2018 / 01:03

Tags