답변:
함수를 작성하십시오.
gclonecd() {
git clone "$1" && cd "$(basename "$1" .git)"
}
( ".git"의 유무에 관계없이 작동합니다)
git
는 쉘의 작업 디렉토리를 변경할 수 없으므로 원하는 방식으로 수행하고 내장 기능을 따르는 별칭 / 함수로 감싸 야합니다 cd
. hub
대신에 전화 git
하려면 함수에서 호출 하십시오. clone
명령 에만 영향을 미치 려면 기능에서 조치를 확인하십시오. 등
basename git@github.com:pckujawa/pattern-rec.git
pattern-rec.git의 결과를 발견했습니다. 복제 할 때 .git 확장자를 그대로 두시겠습니까?
basename
도 접미사 인수를 취하므로 다음을 수행 할 수 있습니다.git clone $1 && cd $(basename $1 .git)
git clone
사용할 디렉토리라는 추가 인수를받습니다. git clone URL .
다음 을 사용하여 현재 작업 디렉토리로 복제 할 수 있습니다. 그러면 작업 디렉토리를 변경할 필요가 없습니다. 당신은 이미 있습니다.
당신이 정말로 원하는 경우 git
실제로 작업 디렉토리를 변경하는 명령을, 당신은 실제 호출하는 기능으로 변경할 수 있습니다 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
}
/tmp
현대 리눅스가 tmpfs를 통해하는 것처럼 RAM에 볼륨이 있습니다. 어쨌든, 디렉토리를 만들고 디스크에 수백 개의 파일을 쓰는 git clone을 수행했을 때 왜 디스크에 쓰기를 원
git [flags] command [arguments]
, 그래서 맹목적으로 요구하는 clone
특정 위치가 실패합니다.
which git
git () {... $ git_real_home "$ @"| 티 $ tmp
리포지토리의 로컬 이름을 제공하면 $ _ 사용하는 것이 정말 쉽습니다 .
git clone git@github.com:npm/npm.git npm-local-dir && cd $_
그러나 긴 이름을 다시 입력하고 싶지 않으면 약간 추악하지만 sed로 실행할 수 있습니다.
git clone git@github.com:pckujawa/pattern-rec.git &&
cd `echo $_ | sed -n -e 's/^.*\/\([^.]*\)\(.git\)*/\1/p'`
편집 : 글쎄, 나는 간결한 마나 브 (의견 아래)에 감사하려고했다
git clone foo/bar && cd !$:t
그러나 zsh에서는 작동하지 않습니다 ( zsh가 확장 을 수행하는 방식에 대한 첫 번째 명령은의 입력으로 처리하지 않습니다 !$
). 나는 무엇을 !$:t
했는지 찾아봐야했다 ( Bash Shell에서 진행 | $ {me : -whatever} ). !$
이전 명령의 마지막 부분을 잡고 :t
"꼬리를 남기고 모든 주요 파일 이름 구성 요소를 제거합니다." 좋은 정보이지만 zsh와 함께 사용할 수 있기를 바랍니다 ( noglob
성공하지 못했습니다).
편집 : sed
또는 !$:t
(zsh에서 작동하지 않는) 을 사용하는 대신 두 가지 다른 옵션을 찾았습니다 (하나 는 https로 https://unix.stackexchange.com/users/5685/frederik-deweerdt 의 대답을 수정했습니다) : //unix.stackexchange.com/users/129926/henrik-n 님 의 댓글) :
git clone git@github.com:npm/npm.git && cd $(basename $_ .git)
또는
git clone git@github.com:npm/npm.git && cd ${${_%%.git*}##*/}
git clone foo/bar && cd !$:t
.git
수 있습니다 !$:t:r
.
당신은 다음과 같은 것을 할 수 있습니다 :
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
또는 모양인지 확인 하는 후크 (각 프롬프트 전에 실행)이며, 그 git clone .../something dir
디렉토리를 추측하여 CD로 들어갑니다.
입력 한 경우 작동하지 않습니다 git clone foo; whatever
나 whatever; git clone foo
또는 git clone --option repo
...
CDing into <project>
와 clone_check:cd:17: no such file or directory: <project>
. 터미널을 닫기 전에 실행 한 마지막 명령이와 다르면 오류가 사라집니다 $ git clone
.
위의 답변에 대한 적응은 다음과 같습니다. OSX
mktemp
추가 매개 변수가 필요합니다git clone
STDERR
기본적으로 쓴다 ( this 참조 )기능:
function git {
local tmp=$(mktemp -t git)
local repo_name
if [ "$1" = clone ] ; then
command git "$@" --progress 2>&1 | 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
command git "$@"
fi
}
나는 그것을 권장하지 않지만, 당신 은 이 하나의 라이너를 사용할 수 있습니다 :
echo 'project' | xargs -I % sh -c 'git clone https://github.com/username/%.git && cd %'
이것을 쉘에 포함하십시오 :
git(){
case "$1" in clone) git-clone "${@:2}";; *) command git "$@";; esac
}
git-clone(){
local tgt
tgt=$(command git clone "$@" 2> >(tee /dev/stderr |head -n1 | cut -d \' -f2)) ||
return $?
cd "$tgt"
}
이것은 복제 대상을 git의 표준 오류에서 의심스럽게 모으고 cd
복제가 성공한 경우에만 대상 에 도달함으로써 작동합니다 .
일반인이하는 모든 주장과 선택을 받아들 git clone
입니다.
git wrapper를 사용하고 완료에 대해 걱정할 필요가 없거나 git wrapper를 제거하고 git clone
완료를로 다시 연결할 수 git-clone
있습니다.
~/.bashrc
파일에 해당 함수를 작성하는 것에 대해 언급해야하며 (예를 들어) 적어도 작동하지 않았으므로 대체하는 것으로 수정해야했습니다. line :/usr/bin/git "$@" 2>&1 | tee $tmp