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

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

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

решение1

Это состоит из трех частей:

  1. Запустить какой-нибудь код при смене текущего каталога. В zsh вы помещаете этот код вchpwdфункция, или функция с другим именем в chpwd_functionsмассиве (пример). ВидетьВыполнять bash-скрипты при входе в каталогдля реализации 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при смене каталога).

решение2

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

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 пустой, но у вас почти наверняка не будет пустого репозитория на диске, так что кого это волнует?

решение3

создайте функцию в файле .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.

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

Связанный контент