백그라운드에서 cd 명령을 실행한 후 git fetch를 실행해야 하며, git 디렉토리에 있는 경우에만 실행해야 합니다.
답변1
여기에는 세 부분이 있습니다.
- 현재 디렉터리를 변경할 때 일부 코드를 실행하세요. zsh에서는 이 코드를
chpwd
기능, 또는 배열에서 다른 이름을 가진 함수chpwd_functions
(예). 보다디렉토리에 들어갈 때 bash 스크립트 실행bash 구현을 위해. - Git 작업 복사본을 감지합니다. 당신은 git에만 관심이 있기 때문에넌 달릴 수 있어
git rev-parse --show-toplevel
. 다른 버전 제어 시스템에 관심이 있는 경우 버전 제어를 감지하는 고급 프레임워크가 있습니다. - 달리다
git fetch
.
다음은 git 저장소로 변경할 때 chpwd
실행되는 구현 입니다.git fetch
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 &
.