2017-12-29 37 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コマンドを実行するには、コマンドを入力するシェルが必要です。

それを行うための方法は、シェル関数又はシェル別名(後者はGitのエイリアスは異なる)を使用することです。 $HOME/.bashrcに(

func() { 
    commands 
} 

は、関数を定義する方法であることを:シェル関数またはシェル別名を定義するための仕様が若干異なりますどのあなたが使用するシェルが、それが持っているのbashやbashのようなシェルでは一般的ですエイリアスを定義する方法には、:

などがあります。したがって、あなたは書くことができます:

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

関連する問題