Intereting Posts
Как обновить кэш Linux «локализовать» `xinit / usr / bin / firefox` vs` xinit firefox` Поиск слова из определенного файла словаря в sdcv (консольная версия словаря Stardict) ERROR: init: ttyS0 (/ dev / ttyS0) основной процесс (1612), завершенный статусом 1 Запустить команду на вход и выход ssh при завершении команды UTF 8 имен файлов? BTRFS RAID1 на разделах вместо диска? (диски разных размеров) Ввод в командной строке, когда запущенный скрипт отображает странные символы Загрузка файлов и max_execution_time и request_terminate_timeout Файлы Valgrind / usr / lib не являются обычными файлами Linux Как определить, будет ли запущенный tar вызвать диск для заполнения Как использовать команду cat для отображения содержимого текстового файла с пронумерованными параграфами? Можно ли отключить в Linux Mint «руку» мыши, которая перемещает окна Где и как я могу получить и установить сертификаты на новую установку OpenSSL? Не удалось загрузить Fedora LiveCD

Запустите git fetch после любой команды cd

Мне нужно запустить git fetch после любой команды cd в фоновом режиме и только в том случае, если я в каталоге git.

Я ужасен в сценариях zsh / bash и могу использовать некоторую помощь с этим

Для этого есть три части:

  1. Запустите некоторый код при изменении текущего каталога. В zsh вы помещаете этот код в функцию chpwd . См. Execute bash scripts при вводе каталога для реализации bash.
  2. Обнаружить рабочие копии git. Поскольку вас интересует только git, вы можете запустить git rev-parse --show-toplevel . Есть более продвинутые рамки для обнаружения контроля версий, если вы заинтересованы в других системах управления версиями.
  3. Запустите git fetch .

Вот реализация chpwd которая запускает git fetch при смене в репозиторий git.

 chpwd () { set -- "$(git rev-parse --show-toplevel)" 2>/dev/null # If cd'ing into a git working copy and not within the same working copy if [ -n "$1" ] && [ "$1" != "$vc_root" ]; then vc_root="$1" git fetch fi } chpwd 

Этот код входит в ваш сценарий запуска оболочки: .zshrc для zsh, .bashrc для bash (в bash вам также нужны оболочки для вызова chpwd при изменении каталога ).

Вы можете использовать функцию:

 function cd() { builtin cd "$@" if [[ -d .git ]]; then git fetch & fi } 

Добавьте это в файл запуска вашей оболочки.

Есть пара вещей, которые здесь происходят:

  1. Сначала мы используем function cd() { для переопределения встроенного поведения cd с нашим собственным кодом.
  2. Очевидно, мы по-прежнему хотим изменить каталог, поэтому мы делаем это сначала – мы префикс его с помощью builtin *, так что оболочка использует встроенный cd вместо рекурсивного вызова нашей пользовательской функции cd() , и мы предоставляем ей $@ в качестве аргументов , который расширяется оболочкой ко всем аргументам, предоставляемым функции.
  3. Мы тестируем, если мы находимся в git-репозитории ^, проверяя, существует ли каталог .git , и если это так, мы запускаем git fetch , сообщая оболочке, чтобы положить его в фоновое пространство, добавив & .

Обратите внимание, что вывод git fetch все равно будет отправлен на терминал. Если вы хотите отказаться от него, вы можете использовать это вместо этого:

 git fetch & 2>&1 >/dev/null 

Это перенаправляет stderr в stdout, а затем отправляет stdout в /dev/null .

[*]: Обратите внимание, что builtin не находится в POSIX, и поэтому это решение не переносимо для всех оболочек

[^]: Это не удается, если репозиторий git голый, но вы почти наверняка не будете иметь голый репозиторий на своем диске, поэтому кто заботится

выполните функцию в файле .bashrc или .zshrc, который находится в вашем домашнем каталоге.

Добавьте в нижнюю часть файла следующее:

 cd_fetch() { command cd "$@" if [ -d .git ]; then git fetch & fi } alias cdg=cd_fetch 

Теперь закройте и снова откройте свой терминал или запустите source ~/.zshrc и теперь вы можете сменить каталог с помощью команды cdg которую вы просто наложили.

Также, если вы не хотите использовать cdg и хотите использовать только cd измените определение alias cd=cd_fetch на alias cd=cd_fetch .

Этот подход по-прежнему выводит все, что обычно делает git fetch, чтобы заставить замолчать его заменить git fetch & line для git fetch 2>&1 >/dev/null & .