特定のタスクを完了したら、コマンドcd
で生成されたディレクトリに自動的に移動したいと思います。clone
git clone
重要:プロジェクトから自動的に取得されるzshの完了は中断されるため、コマンド構文(エイリアス/関数を使用するなど)を変更したくありませんPretzo
。
編集する:正解を選択しなかった理由は、上記の基準に合った回答が与えられなかったためです。
ZSHを使用しますが、他のシェルからの回答も許可されています。
答え1
関数を生成します。
gclonecd() {
git clone "$1" && cd "$(basename "$1" .git)"
}
(「.git」の有無にかかわらずリンクに適用)
答え2
git clone
使用するディレクトリと呼ばれる追加のパラメータが1つ必要です。これを現在の作業ディレクトリに複製すると、すでに存在git clone URL .
する作業ディレクトリを変更する必要はありません。
コマンドが実際に作業ディレクトリを変更できるようにするには、必要に応じてgit
realを呼び出す関数に変更できます。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
}
答え3
リポジトリのローカル名を指定すると、使いやすくなります。$_:
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
何が起きたのかを調べなければなりません(Bash シェルで進行中 ${me:-whatever} |)。!$
前のコマンドの最後の部分をつかみ、:t
「尾だけを残してすべての先行ファイル名コンポーネントを削除」します。良い情報ですが、zshと連携できたらいいです(試してみましたがnoglob
成功しませんでした)。
sed
編集:or !$:t
(とにかくzshでは機能しません)を使用する代わりに、2つの異なるオプションを見つけました。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*}##*/}
答え4
次のことができます。
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
orに似ていることを確認しgit clone .../something dir
、そこからディレクトリを推測してそこに入るフック(すべてのプロンプトの前に実行されます)です。
git clone foo; whatever
whatever; git clone foo
or or ...と入力すると機能しませんgit clone --option repo
。