자식 복제 후 자동으로 CD를 만드는 방법?


35

무언가를 한 후에 명령으로 cd작성된 디렉토리 로 자동으로 가고 싶습니다 .clonegit clone

중요 :Pretzo 프로젝트 에서 자동으로 얻는 zsh- 완료를 손상시킬 수 있기 때문에 명령 구문을 변경하고 싶지 않습니다 (예 : 별칭 / 함수 사용) .

편집 : 내가 정답을 선택하지 않은 이유는 위의 조건을 준수하는 답변이 없기 때문입니다.

ZSH를 사용하지만 다른 쉘에서도 대답이 가능합니다.


나는 대답 unix.stackexchange.com/questions/97920/…을 좋아 하지만 ~/.bashrc파일에 해당 함수를 작성하는 것에 대해 언급해야하며 (예를 들어) 적어도 작동하지 않았으므로 대체하는 것으로 수정해야했습니다. line :/usr/bin/git "$@" 2>&1 | tee $tmp
lcestari

답변:


19

함수를 작성하십시오.

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

( ".git"의 유무에 관계없이 작동합니다)


2
사용 git clone하지 않을 경우 변경해야 할 모든 도구 때문에 계속 사용 하고 싶습니다 git. 허브 는 git으로 별칭이 지정됩니다. oh-my-zsh는 자동 완성 등을 제공합니다.
Daniel K.

3
@Wildeyes git는 쉘의 작업 디렉토리를 변경할 수 없으므로 원하는 방식으로 수행하고 내장 기능을 따르는 별칭 / 함수로 감싸 야합니다 cd. hub대신에 전화 git하려면 함수에서 호출 하십시오. clone명령 에만 영향을 미치 려면 기능에서 조치를 확인하십시오. 등
frostschutz

basename git@github.com:pckujawa/pattern-rec.gitpattern-rec.git의 결과를 발견했습니다. 복제 할 때 .git 확장자를 그대로 두시겠습니까?
Pat

8
@Pat basename도 접미사 인수를 취하므로 다음을 수행 할 수 있습니다.git clone $1 && cd $(basename $1 .git)
Henrik N

17

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
}

바로 내가 찾던 것이 었습니다. 내부 후크 또는 이와 유사한 것이 없다는 것을 깨달은 후 거의 정확한 기능을 작성했습니다. :
Daniel K.

2
@Wildeyes 예 : /tmp현대 리눅스가 tmpfs를 통해하는 것처럼 RAM에 볼륨이 있습니다. 어쨌든, 디렉토리를 만들고 디스크에 수백 개의 파일을 쓰는 git clone을 수행했을 때 왜 디스크에 쓰기를 원
Kaz

1
당신은 아마도 전체 "nvm이 디스크에 쓰는 경우"에 관한 것입니다. 추가 작업을 저장하려고했습니다. 고마워요.
Daniel K.

3
조심해. 그것은입니다 git [flags] command [arguments], 그래서 맹목적으로 요구하는 clone특정 위치가 실패합니다.
vonbrand

1
"실제"경로를 추가하면 도움이됩니까? git_real_home = which git git () {... $ git_real_home "$ @"| 티 $ tmp
aakoch

7

리포지토리의 로컬 이름을 제공하면 $ _ 사용하는 것이 정말 쉽습니다 .

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
Manav

리포지토리 URL이 끝나면 폴더 이름을 얻을 .git수 있습니다 !$:t:r.
Michael Stramel

2

POSIX 쉘의 간단한 해결책은 명시 적으로 복제 할 디렉토리를 지정하고 (모든 파일 시스템 경로) 재사용하는 것입니다.

git clone <repository> <directory> &&
cd "$_"

cd -

당신이 끝나면.


2

당신은 다음과 같은 것을 할 수 있습니다 :

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; whateverwhatever; git clone foo또는 git clone --option repo...


+1 코드 감사합니다. 며칠 이후로 사용하고 있습니다. 방금 한 가지 문제를 발견했습니다. 당신은 몇 가지 프로젝트를 복제 한 후 터미널 권리를 닫으면, 터미널을 열고 다음 번에, zsh을 두 가지 오류 메시지와 함께 불평 : CDing into <project>clone_check:cd:17: no such file or directory: <project>. 터미널을 닫기 전에 실행 한 마지막 명령이와 다르면 오류가 사라집니다 $ git clone.
user938271

2

위의 답변에 대한 적응은 다음과 같습니다. OSX

  • mktemp 추가 매개 변수가 필요합니다
  • git cloneSTDERR기본적으로 쓴다 ( 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
}

1
당신의 "위"에 표시되는 7 개의 답변이 있습니다. 그러나 시간이지나면서 바뀔 수 있습니다. 이러한 참조는 SE에서 의미가 없으므로 답변을 수정하고 언급 한 답변에 대한 링크를 포함하십시오.
techraf

0

나는 그것을 권장하지 않지만, 당신 이 하나의 라이너를 사용할 있습니다 :

echo 'project' | xargs -I % sh -c 'git clone https://github.com/username/%.git && cd %'


0

이것을 쉘에 포함하십시오 :

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있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.