Questão Avisar antes de se comprometer acidentalmente com `-a`?


Muitas vezes me comprometo com git commit -a. Então, novamente, eu às vezes encenar arquivos individuais com git add e se comprometer sem -a. Quando não tenho cuidado, acontece que eu digito -a Por acidente, quando eu já havia preparado uma área de preparo meticulosamente trabalhada para o meu próximo commit, que eu teria que refazer o trabalho se eu quiser manter alterações distintas em commits separados.

Existe uma maneira de impedir isso? O ideal seria perguntar sobre (ou recusar categoricamente) o -a Alterne se (e somente se) algumas alterações já estiverem sendo testadas. Eu acho que deveria haver uma configuração para isso, mas eu não consegui encontrá-lo ...


0


origem




Respostas:


Abordagem Unix aqui.

Você não precisa git suporte para obter 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 na planície 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, torná-lo executável e colocá-lo em um diretório que está no seu $PATH antes do diretório com o real git. $HOME/bin pode ser o lugar certo; meu Debian até fornece .profile (através da /etc/skel/.profile) que adiciona este caminho para PATH automaticamente (se o diretório existir). Basta lembrar que qualquer ferramenta (por exemplo, um script) que dependa de $PATH chamar git irá chamar seu script 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". Eu não estou familiarizado com git mas eu acredito esta resposta fornece uma maneira de verificar isso:

git diff --cached

Use-o para expandir a lógica da sua função ou script. Tenha em mente que você precisa /full/path/to/git para evitar que seu script chame a si mesmo 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 pelo mesmo motivo.

Além disso, você pode querer substituir [ "$option" = "-a" ] com algo parecido

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

para cobrir casos em que a ï¿½dado com outros interruptores numa forma compacta (e. -Pa). o [[ comando não é portável Apesar.


1



Obrigado pelo roteiro. Infelizmente, ele não lida com o caso em que a faz parte de uma lista de opções de taquigrafia (como git commit -am, git commit -Pa), mas além disso, é muito bom e posso codificar facilmente a condição do palco. - Raphael Schweikert
@RaphaelSchweikert Em vez de [ ... ] usar [[ "$option" =~ ... ]] dentro bash. o =~ trata a string à direita como uma expressão regular estendida. - Kamil Maciorowski
@RaphaelSchweikert eu adicionei [[ exemplo no final da resposta. - Kamil Maciorowski