Я часто фиксирую с помощью git commit -a . С другой стороны, я иногда создаю отдельные файлы с помощью git add и commit без -a . Когда я не проявляю осторожности, случается, что я -a случайно, когда я предварительно подготовил тщательно подготовленную область подготовки для моего следующего коммита, который мне потом придется переделывать, если я серьезно настроен сохранить отдельные изменения в отдельности. совершает.

Есть ли способ предотвратить это? В идеале git должен спрашивать (или категорически отказываться) о -a если (и только если) некоторые изменения уже внесены. Я думаю, что должен быть конфиг для этого, но я не мог найти его ...

1 ответ1

1

Подход Unix здесь.

Вам не нужна поддержка git чтобы получить простое предупреждение. Вы можете написать скрипт-оболочку или функцию оболочки, которая будет проверять параметры командной строки и предпринимать соответствующие действия.

Эта функция должна работать в bash (возможно, добавьте ее в ваш .bashrc ) или даже в обычном 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 "$@"
}

В качестве альтернативы скрипт вместо функции:

#!/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" "$@"

Назовите скрипт git , сделайте его исполняемым и поместите его в каталог, который находится в вашем $PATH перед каталогом с настоящим git . $HOME/bin может быть правильным местом; Мой Debian даже предоставляет .profile (через /etc/skel/.profile), который автоматически добавляет этот путь в PATH (если каталог существует). Просто помните, что любой инструмент (например, скрипт), который использует $PATH для вызова git теперь будет вызывать ваш скрипт-обертку. Вы можете не хотеть этого. Если это так, используйте подход функции оболочки.

Вся процедура является доказательством концепции, она может быть неоптимальной. Это еще не заботится о вашем условии «если (и только если) некоторые изменения уже поставлены». Я не знаком с git но я считаю, что этот ответ дает возможность проверить это:

git diff --cached

Используйте его, чтобы расширить логику вашей функции или сценария. Имейте в виду, что вам нужно /full/path/to/git чтобы ваш скрипт не вызывал себя и не застревал в цикле (например, вилочная бомба без разветвления, цепная бомба). Функция должна использовать /full/path/to/git или command git по той же причине.

Также вы можете заменить [ "$option" = "-a" ] на что-то вроде

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

чтобы охватить случаи , когда дается с другими коммутаторами в компактной форме (например , a Команда -Pa не является переносимой, хотя.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .