2017-12-29 76 views
0

다른 프로젝트의 시작 지점으로 레포를 사용하려고합니다.git 별칭이 프로젝트로 cd하기 전에 복제본이 완료 될 때까지 기다리지 않습니까?

내가 여기이 요점을 수행했다 : https://gist.github.com/mdentinho/6258238

와 나는 다음과 같다 별칭 만든 취지를 시작 :

boilerplate-website = !git clone -o website-boilderplate https://[email protected]/user/website-boilderplate.git "$1" && cd "$1" && rm readme.md && touch readme.md && rm -rf .git && git init && git add -A && git commit -m 'First Commit' 

을하지만 CD의 일부가 작동하지 않는 것 같습니다, 나는 아직 디렉토리에 있지만 새로 복제 된 디렉토리 안의 명령은 실행하지 않습니다.

또한이 때문에이 오류가 발생하고 별칭이 모든 명령을 완료하지 못합니다 (복제본뿐입니다).

Cloning into 'test2'... 
remote: Counting objects: 19, done. 
remote: Compressing objects: 100% (18/18), done. 
Unpacking objects: 100% (19/19), done. 
remote: Total 19 (delta 1), reused 0 (delta 0) 
rm: readme.md: No such file or directory 

복제가 완료 될 때까지 기다리지 않는 이유는 무엇입니까? 나는 정기적으로 사용자를했습니다.

git clone {repo} {folder name} && cd {folder name} 

그리고 잘 작동합니다.

, cdcd 명령을 실행하는 쉘에 영향을

+2

'cd'는 새롭게 생성 된 쉘에 영향을 주지만 명령을 실행하는 쉘에는 영향을 미치지 않습니다. – PetSerAl

+0

별칭에서 얻으려고하는 것을 얻을 수있는 방법이 있습니까? – Nick

+0

유일한 방법은 현재 디렉토리 경로를 현재 쉘로 리턴하고 현재 쉘에서'cd'를 리턴하는 것입니다. 'boilerplate'가'pwd'를 호출하여 끝나는'cd "$ (git boilerplate)"'와 같은 것입니다. – phd

답변

1

PetSerAl noted in a comment으로 어떤 도움을 주셔서 감사합니다, 그리고 쉘 자체가 급부상 하위 명령/하위 쉘; git boilerplate-website과 같이 "외부 레이어"쉘에는 영향을주지 않습니다. 이 별칭에있는 !은 "하위 셸을 통해 실행"을 의미합니다.

이 의미는 사용자가 원하는 방식으로 달성 할 수 없다는 것을 의미합니다. cd 명령을 실행하려면 쉘 (명령을 입력하는 쉘)이 필요합니다.

그렇게하는 방법은 쉘 함수 또는 쉘 별명 (후자는 힘내 별명 상이하다)를 이용하는 것이다. $HOME/.bashrc에 (

func() { 
    commands 
} 

함수를 정의하는 방법이 : 쉘 함수 또는 쉘 별명을 정의하는 특성이 약간 따라 달라질 수있는 사용 쉘,하지만 가지고 배쉬와 배쉬 같은 쉘에서 일반적입니다 예를 들어), 그리고 :

alias name='expansion with arguments' 

별칭을 정의 할 수있는 방법이 될 수 있습니다. 따라서 당신은 쓸 수 :

newwebsite() { 
    case $# in 
    1) ;; 
    *) echo "usage: newwebsite <name>" 1>&2; return 1;; 
    esac 
    git clone -o website-boilderplate \ 
     https://[email protected]/user/website-boilderplate.git \ 
     "$1" || { echo "git clone step failed, aborting" 1>&2; return 1; } 
    cd "$1" && 
    rm readme.md && 
    touch readme.md && 
    rm -rf .git && 
    git init && 
    git add -A && 
    git commit -m 'First Commit' 
} 

(나는 그대로 당신의 구조를 유지하면서, 가능한 한 읽을 수 있도록하려고하는 기능으로이 서면으로 작성했습니다.) 당신이 앞에 git 명령없이이를 실행하는 것이 주 즉 newwebsite foo이고 git newwebsite foo이 아닙니다.

+0

설명해 주셔서 감사합니다. 그런 다음 별칭 명령을 어떻게 실행합니까? "newwebsite ? – Nick

+0

@ 닉 : 예, 물어 보는 동안 편집을해야합니다 :-) – torek

+0

고마워요. 시도해 보겠습니다. – Nick