git clone 후 자동으로 CD를 생성하는 방법은 무엇입니까?

git clone 후 자동으로 CD를 생성하는 방법은 무엇입니까?

특정 작업을 완료한 후 cd명령으로 생성된 디렉터리로 자동으로 이동하고 싶습니다.clonegit clone

중요한:프로젝트에서 자동으로 얻는 zsh 완료가 중단되므로 명령 구문(예: 별칭/함수 사용)을 변경하고 싶지 않습니다 Pretzo.

편집하다: 정답을 선택하지 않은 이유는 위의 기준에 맞는 답변이 주어지지 않았기 때문입니다.

ZSH를 사용하지만 다른 셸의 답변도 허용됩니다.

답변1

함수를 생성합니다:

gclonecd() {
  git clone "$1" && cd "$(basename "$1" .git)"
}

(".git"이 있거나 없는 링크에 적용)

답변2

git clone사용할 디렉터리라는 하나의 추가 매개변수가 필요합니다. 이를 현재 작업 디렉토리에 복제하면 git clone URL . 이미 있는 작업 디렉토리를 변경할 필요가 없습니다.

명령이 실제로 작업 디렉터리를 변경하도록 하려면 필요한 경우 gitreal을 호출하는 함수 로 변경할 수 있습니다.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 .../somethingor 와 유사한지 확인하고 git clone .../something dir, 여기에서 디렉토리를 추측하여 그 안으로 들어가는 후크(모든 프롬프트 전에 실행됨) 입니다 .

git clone foo; whateverwhatever; git clone fooor or ... 를 입력하면 작동하지 않습니다 git clone --option repo.

관련 정보