cloneによって作成されたディレクトリにcdを自動的に移動したい git clone何かをした後のdiv>コマンド。

重要: Pretzoプロジェクトから自動的に取得するzsh-completionsが破損するため、コマンドの構文を変更したくありません(たとえば、エイリアス/関数を使用します)。

編集:正解を選択しなかった理由は、正解がなかったためです。上記の条件に準拠していることを前提としています。

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を使用していなかった場合に変更する必要のあるすべてのツールのうち。 ハブは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)

回答

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ボリュームがありますRAMは、最近のLinuxと同様に、tmpfsを介して実行されます。とにかく、’ディレクトリを作成しておそらく数百のファイルをディスクに書き込むgitクローンを作成したばかりのときにディスクへの書き込みを気にするのはなぜですか…
  • ‘ディスクに書き込む場合、” nvm全体についておそらく正しい”ことですが、余分な操作を節約したいと思っていました。 Kazに感謝します。
  • 注意してください。 git [flags] command [arguments]であるため、特定の位置でcloneを盲目的に要求すると失敗します。
  • 実際の”パスヘルプ?例:git_real_home = which git git(){… $ git_real_home ” $ @ ” | tee $ tmp

回答

リポジトリのローカル名を指定すると、非常に簡単に使用できます。 $ _

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が何をしたかを調べなければなりませんでした(バッシュシェルでの前進| $ {me:-whatever} ) 。 !$は前のコマンドの最後の部分を取得し、:tは「先頭のファイル名コンポーネントをすべて削除して末尾を残します。「良い情報ですが、zshで動作させることができればいいのですが(noglobを試しましたが成功しませんでした)。

編集:

または!$:t(とにかく、zshでは機能しません)、他に2つのオプションが見つかりました(1つは 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 - 

完了したら

回答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) 

非常に単純です。 precmdフック(各プロンプトの前に実行)は、最後のコマンドラインがgit clone .../somethingまたは、そこからディレクトリを推測し、そこにcdします。

git clone foo; whateverまたはwhatever; git clone fooまたはgit clone --option repo

コメント

  • +1ありがとうあなたはコードをとても気に入っています。 ‘数日から使用しています。 ‘ 1つの問題に気づきました。プロジェクトのクローンを作成した直後にターミナルを閉じると、次にターミナルを開いたときに、zshは2つのエラーメッセージ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ラッパーを使用して完了を心配する必要がないか、gitラッパーを削除してgit cloneの完了をgit cloneに再配線することができます。 div id = “05cddf7296”>

回答

これは@ 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 “は指定されたフォルダまたはデフォルトのgitリポジトリ名に挿入されます。

使用法

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"; }  

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です