clone
によって作成されたディレクトリにcd
を自動的に移動したい git clone
何かをした後のdiv>コマンド。
重要: Pretzo
プロジェクトから自動的に取得するzsh-completionsが破損するため、コマンドの構文を変更したくありません(たとえば、エイリアス/関数を使用します)。
編集:正解を選択しなかった理由は、正解がなかったためです。上記の条件に準拠していることを前提としています。
ZSHを使用していますが、他のシェルでの回答も受け入れられます。
コメント
回答
関数を作成する:
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"; }
~/.bashrc
ファイル(たとえば)に記述し、私にとってはl東では’が機能しなかったので、次の行を置き換えて修正する必要がありました:/usr/bin/git "$@" 2>&1 | tee $tmp