clone에서 만든 디렉토리에 자동으로 cd를 지정합니다. div> 명령을 git clone로 지정했습니다.

중요 : Pretzo 프로젝트에서 자동으로 얻은 zsh 완성을 깨뜨릴 수 있기 때문에 명령 구문 (예 : 별칭 / 함수 사용)을 변경하고 싶지 않습니다.

수정 : 내가 올바른 답을 선택하지 않은 이유는 답이 없었기 때문입니다. 위의 조건을 준수했음을 감안할 때

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

댓글

  • unix.stackexchange.com/questions/97920/ … 답변이 마음에 들지만 이 함수를 ~/.bashrc 파일 (예 :)에 작성하고 저를 위해 l 동쪽으로는 ‘ 작동하지 않았습니다. 다음 줄을 바꾸어 수정해야했습니다. /usr/bin/git "$@" 2>&1 | tee $tmp

답변

함수 만들기 :

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

(둘 다 링크에서 작동 “.git”포함 및 제외)

댓글

  • git clone를 계속 사용하고 싶습니다. git를 사용하지 않는 경우 변경해야 할 모든 도구 중. Hub 는 git로 별칭이 지정되고 oh-my-zsh는 자동 완성 기능 등을 제공합니다 …
  • @Wildeyes git는 셸의 작업 디렉터리를 ‘ 변경할 수 없으므로 어느 쪽이든 ‘ 포장해야합니다. 원하는 것을 수행하고 내장 된 cd를 따르는 별칭 / 함수에서. git 대신 hub를 호출하려면 함수에서 호출하십시오. clone 명령에만 영향을 미치려면 함수에서 작업을 확인하십시오. 등.
  • basename [email protected]:pckujawa/pattern-rec.git 결과 pattern-rec.git이 생성되는 것을 발견했습니다. 복제 할 때 .git 확장자를 그대로 두십니까?
  • @Pat basename도 접미사 인수를 취하므로 다음과 같이 할 수 있습니다. git clone $1 && cd $(basename $1 .git)

Answer

git clone는 사용할 디렉토리라는 추가 인수를받습니다. git clone URL .를 사용하여 현재 작업 디렉토리로 복제 할 수 있습니다. 그러면 작업 디렉토리를 변경할 필요가 없습니다. 당신은 이미 거기에 있습니다.

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 } 

댓글

  • 정확히 내가 찾던 것. 내부 후크 나 이와 비슷한 것이 없다는 것을 깨달은 후 거의 정확한 함수를 작성했습니다. 🙂
  • @Wildeyes 예 : /tmp 볼륨이 있습니다. 최신 Linux가 tmpfs를 통해 수행하는 것처럼 RAM. 어쨌든, ‘ 디렉토리를 만들고 아마도 수백 개의 파일을 디스크에 쓰는 git 복제를 방금 수행했을 때 디스크에 쓰는 데 관심이있는 이유는 무엇입니까 …
  • 당신이 ‘ 디스크에 쓰는 경우 ” nvm에 대해 아마 맞습니다. ” 일, 나는 단지 추가 작업을 저장하려고했습니다. Kaz에게 감사합니다.
  • 조심하세요. git [flags] command [arguments]이므로 특정 위치에서 맹목적으로 clone를 요청하면 실패합니다.
  • 실제 ” 경로 도움말? 좋아요 : git_real_home = which git git () {… $ git_real_home ” $ @ ” | tee $ tmp

Answer

저장소의 로컬 이름을 제공하면 사용하기가 정말 쉽습니다. $ _ :

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가 무엇을했는지 찾아봐야했습니다 ( Advancing in the Bash Shell | $ {me : -whatever} ). . !$는 이전 명령의 마지막 부분을 가져오고 :t는 “모든 선행 파일 이름 구성 요소를 제거하고 꼬리는 남깁니다.”좋은 정보이지만 zsh와 함께 작동하기를 바랍니다 (나는 성공하지 못한 상태로 noglob 시도).

편집 :

또는 !$: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*}##*/} 

댓글

  • git clone foo/bar && cd !$:t
  • 저장소 URL이 .git !$:t:r를 사용하여 폴더 이름을 가져올 수 있습니다.

답변

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

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

cd - 

완료하면

Answ er

다음과 같이 할 수 있습니다.

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) 

매우 간단합니다. 마지막 명령 줄이 git clone .../something 또는 iv id = “와 같은지 확인하는 것은”precmd 후크 (각 프롬프트 전에 실행 됨)입니다. 53b326ad13 “>

, 그 디렉토리에서 디렉토리를 추측하고 CD로 넣으십시오.

git clone foo; whatever 또는 whatever; git clone foo 또는 git clone --option repo

댓글

  • 감사 1 회 당신은 코드에 매우 많이; 며칠 동안 ‘ 사용하고 있습니다. 저는 ‘ 방금 한 가지 문제를 발견했습니다. 일부 프로젝트를 복제 한 후 바로 터미널을 닫으면 다음에 터미널을 열 때 zsh가 CDing into <project>clone_check:cd:17: no such file or directory: <project>. 터미널을 닫기 전에 실행 한 마지막 명령이 $ git clone와 다르면 오류가 사라집니다.

답변

다음은 OSX

  • 에는 추가 매개 변수가 필요합니다.
  • git clone는 기본적으로 STDERR에 기록합니다 ()

기능 :

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 } 

댓글

  • 귀하의 답변 ” 위에 ” 표시되는 답변이 7 개 있습니다. 그러나 시간이 지남에 따라 변경 될 수 있습니다. 이러한 참조는 SE에서 의미가 없습니다. 답변을 수정하고 참조한 답변에 대한 링크를 포함하세요.

답변

귀하의 요청에는 거의 불가능한 근본적인 문제가 있습니다. git은이 경우 쉘의 자식 프로세스이고 자식 프로세스는 대부분의 운영 체제에서 부모의 환경을 수정할 수 없습니다. 따라서 ,이 작업을 수행하는 유일한 방법은 별칭 또는 함수를 구현하여 셸 측에서 수행하는 것입니다.

여기에서 추가 세부 정보를 찾을 수 있습니다. https://stackoverflow.com/questions/2375003/how-do-i-set-the-working-directory-of-the-parent-process

답변

권장하지는 않지만 이 한 줄짜리를 사용할 수 있습니다 :

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 “ing 복제가 성공한 경우에만 대상으로.

일반 git clone가 수행하는 모든 인수와 옵션을 허용합니다.

git wrapper를 사용하고 완료에 대해 걱정할 필요가 없습니다. 또는 git wrapper를 제거하고 git clone 완료를 git-clone.

답변

@ frederik-deweerdt를 기반으로 만들었습니다. 답변.

따라서 사용자는 클립 보드에있는 저장소 링크를 clone에 복제 할 수 있습니다. 저장소에 알리면 입력보다 복제됩니다.

xclip를 설치해야합니다.

clone() { if [ -z "$1" ] then local repo=$(xclip -o) else local repo=$1 fi git clone "$repo" && cd "$(basename "$repo" .git)" } 

답변

다른 구현으로 git clone 명령에 대한 추가 인수도 처리합니다.

올바르게 cd “s를 제공된 폴더 또는 기본 git repo 이름에 넣습니다.

사용

gclonecd https://github.com/example/repo gclonecd https://github.com/example/repo my-custom-folder 

배시 함수

 # Clones git repo and cd"s into it gclonecd() { git_dir="$(basename "$1" .git)" git_dir_resolved=${2:-$git_dir} git clone "$@" && cd "$git_dir_resolved"; }  

답글 남기기

이메일 주소를 발행하지 않을 것입니다. 필수 항목은 *(으)로 표시합니다