Приглашение zsh :Проверить, находится ли внутри репозитория git и не игнорируется ли git

lastчитает файл /var/log/wtmp. Обычно при выключении системы в этот файл записывается запись, указывающая на этот факт; то же самое происходит при загрузке системы для записи момента загрузки.

В вашем случае, по-видимому, запись о завершении работы не была записана в файл в последний раз, поэтому lastне может найти запись о завершении работы, совпадающую с записью загрузки, и пишет «все еще работает», как это обычно бывает в такая ситуация.

Я видел, как Debian-версия команды lastпоказывала «крах» в такой ситуации, возможно, версия Fedora считает это слишком тревожным, поскольку могут быть другие причины отсутствия записи.

9
10.01.2021, 10:17
2 ответа

git check-ignore.завершится ошибкой с кодом выхода 128, если .не находится в gitрепозитории (или произойдет любая другая ошибка ), и с кодом выхода 1, только если путь не игнорируется. Таким образом, вы можете проверить только последнее:

git check-ignore -q. 2>/dev/null; if [ "$?" -ne "1" ]; then... 

Внутри thenвы обрабатываете случай, когда .игнорируется или отсутствует в репозитории git.

Чтобы это работало за пределами файловой системы, установите для GIT_DISCOVERY_ACROSS_FILESYSTEMзначение true:

.
GIT_DISCOVERY_ACROSS_FILESYSTEM=true git check-ignore -q. 2>/dev/null; if [ "$?" -ne "1" ]; then...
14
18.03.2021, 22:39

Сначала должно быть:

if
  git rev-parse --is-inside-work-tree >/dev/null 2>&1 &&
    ! git check-ignore. >/dev/null 2>&1
then...

Подстановка команд($(...))предназначена для извлечения вывода команды. Здесь нет вывода, поскольку вы перенаправляете его на /dev/null, и если бы он был, он был бы воспринят как команда для выполнения (и проверки его статуса выхода ).

Обратите внимание, что вторая команда запускается только в случае успешного выполнения первой.

@StephenKitt показал, как разложить эти две команды на множители в одну gitкоманду , но если это по-прежнему не помогает с точки зрения производительности, вы всегда можете кэшировать информацию в ассоциативном массиве.

typeset -A is_git # declared globally in your ~/.zshrc
if (( ! $+is_git[$PWD] )); then
  git check-ignore -q. 2> /dev/null
  is_git[$PWD]=$(( $? == 1 ))
fi

if (( $is_git[$PWD] )); then...

Этот кеш может устареть, если вы переименуете каталоги, удалите .gitкаталоги или измените список игнорируемых файлов. Вы можете аннулировать его с помощью is_git=()или перезапустив zshс помощью exec zsh.

Другим вариантом может быть проверка только при входе в каталог с помощью хука chpwd:

check_git() {
  git check-ignore -q. 2> /dev/null
  (( is_git = $? == 1 ))
}
chpwd_functions+=(check_git)

А затем, в вашей быстрой рутине, это всего лишь вопрос:

if (( is_git )); then...
12
18.03.2021, 22:39

Теги

Похожие вопросы