특정 작업을 완료한 후 cd
명령으로 생성된 디렉터리로 자동으로 이동하고 싶습니다.clone
git clone
중요한:프로젝트에서 자동으로 얻는 zsh 완료가 중단되므로 명령 구문(예: 별칭/함수 사용)을 변경하고 싶지 않습니다 Pretzo
.
편집하다: 정답을 선택하지 않은 이유는 위의 기준에 맞는 답변이 주어지지 않았기 때문입니다.
ZSH를 사용하지만 다른 셸의 답변도 허용됩니다.
답변1
함수를 생성합니다:
gclonecd() {
git clone "$1" && cd "$(basename "$1" .git)"
}
(".git"이 있거나 없는 링크에 적용)
답변2
git clone
사용할 디렉터리라는 하나의 추가 매개변수가 필요합니다. 이를 현재 작업 디렉토리에 복제하면 git clone URL .
이미 있는 작업 디렉토리를 변경할 필요가 없습니다.
명령이 실제로 작업 디렉터리를 변경하도록 하려면 필요한 경우 git
real을 호출하는 함수 로 변경할 수 있습니다.git
git()
{
local tmp=$(mktemp)
local repo_name
if [ "$1" = clone ] ; then
/usr/bin/git "$@" | tee $tmp
repo_name=$(awk -F\' '/Cloning into/ {print $2}' $tmp)
rm $tmp
printf "changing to directory %s\n" "$repo_name"
cd "$repo_name"
else
/usr/bin/git "$@"
fi
}
답변3
저장소의 로컬 이름을 제공하면 사용하기가 매우 쉽습니다.$_:
git clone [email protected]:npm/npm.git npm-local-dir && cd $_
그러나 긴 이름을 다시 입력하고 싶지 않다면 이는 약간 보기 흉하지만 sed를 사용하면 가능합니다.
git clone [email protected]:pckujawa/pattern-rec.git &&
cd `echo $_ | sed -n -e 's/^.*\/\([^.]*\)\(.git\)*/\1/p'`
편집: 음, Manav(아래 설명)의 간결함에 대해 감사를 표하고 싶습니다.
git clone foo/bar && cd !$:t
하지만 그것은zsh에서는 작동하지 않습니다(어떤것에 대하여zsh를 확장하는 방법첫 번째 명령을 입력으로 처리하지 않게 됩니다) !$
. !$:t
무슨 일이 있었는지 찾아봐야겠어요 (Bash 셸에서 진행 중 ${me:-whatever} |). !$
이전 명령의 마지막 부분을 잡고 :t
"꼬리만 남기고 모든 선행 파일 이름 구성 요소를 제거"합니다. 좋은 정보지만 zsh와 함께 작동할 수 있었으면 좋겠습니다(시도했지만 noglob
성공하지 못했습니다).
sed
편집: or !$:t
(어쨌든 zsh에서는 작동하지 않음)을 사용하는 대신 두 가지 다른 옵션을 찾았습니다.https://unix.stackexchange.com/users/5685/frederik-deweerdt정답은https://unix.stackexchange.com/users/129926/henrik-n)의 의견:
git clone [email protected]:npm/npm.git && cd $(basename $_ .git)
또는
git clone [email protected]:npm/npm.git && cd ${${_%%.git*}##*/}
답변4
다음을 수행할 수 있습니다.
clone_check() {
(($? != 0)) && return
local cmd=$history[$((HISTCMD-1))]
cmd=("${(@Q)${(z)cmd}}")
if [[ $cmd = "git clone "* ]]; then
local dir
if (($#cmd == 3)); then
dir=${cmd[3]:t}
dir=${dir%.git}
dir=${dir#*:}
elif (($#cmd > 3)); then
dir=$cmd[-1]
else
return
fi
print -r CDing into $dir > /dev/tty
cd -- $dir
fi
}
precmd_functions+=(clone_check)
아주 간단합니다. precmd
마지막 명령줄이 git clone .../something
or 와 유사한지 확인하고 git clone .../something dir
, 여기에서 디렉토리를 추측하여 그 안으로 들어가는 후크(모든 프롬프트 전에 실행됨) 입니다 .
git clone foo; whatever
whatever; git clone foo
or or ... 를 입력하면 작동하지 않습니다 git clone --option repo
.