Мне нужно запустить git fetch после любой команды cd в фоновом режиме и только если я нахожусь в каталоге git.
решение1
Это состоит из трех частей:
- Запустить какой-нибудь код при смене текущего каталога. В zsh вы помещаете этот код в
chpwd
функция, или функция с другим именем вchpwd_functions
массиве (пример). ВидетьВыполнять bash-скрипты при входе в каталогдля реализации bash. - Определить рабочие копии git. Поскольку вас интересует только git,Вы можете запустить
git rev-parse --show-toplevel
. Если вас интересуют другие системы контроля версий, существуют более продвинутые фреймворки для обнаружения контроля версий. - Бегать
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
}
Добавьте это в файл запуска вашей оболочки.
Здесь происходит несколько вещей:
- Сначала мы
function cd() {
переопределяем встроенноеcd
поведение с помощью нашего собственного кода. - Очевидно, что мы все равно хотим изменить каталог, поэтому мы делаем это в первую очередь — добавляем к нему префикс
builtin
*, чтобы оболочка использовала встроенную функциюcd
вместо рекурсивного вызова нашей пользовательскойcd()
функции, и предоставляем ее$@
в качестве аргументов, которые оболочка расширяет на все аргументы, предоставленные функции. - Мы проверяем, находимся ли мы в репозитории 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 &
.