回答:
関数を作成します。
gclonecd() {
git clone "$1" && cd "$(basename "$1" .git)"
}
(「.git」のあるリンクとないリンクの両方で機能します)
git
はシェルの作業ディレクトリを変更できないため、どちらの方法でも、必要な処理を行い、組み込みコマンドでフォローアップするエイリアス/関数でラップする必要がありますcd
。のhub
代わりに呼び出す場合git
は、関数で呼び出します。clone
コマンドにのみ影響を与えたい場合は、関数内のアクションを確認してください。など
basename git@github.com:pckujawa/pattern-rec.git
pattern-rec.gitが生成されることに気づきました-クローンを作成するときに.git拡張子をそのまま残していますか?
basename
あなたが行うことができますので、また、接尾辞引数を取る:git clone $1 && cd $(basename $1 .git)
git clone
追加の引数を取ります:使用するディレクトリ。git clone URL .
その後、現在の作業ディレクトリにクローンを作成できます。その後、作業ディレクトリを変更する必要はありません。あなたはすでにそこにいます。
git
コマンドで実際に作業ディレクトリを変更したい場合は、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
}
/tmp
現代のLinuxがtmpfs経由で行うように、RAM内にボリュームがあります。とにかく、なぜあなたは...あなただけのディレクトリを作成し、ディスクにおそらく数百のファイルを書き込みgitのクローンを、やった時に、ディスクへの書き込みを気にします
git [flags] command [arguments]
のでclone
、特定の位置で盲目的に要求しても失敗します。
which git
git(){... $ git_real_home "$ @" | ティー$ tmp
リポジトリのローカル名を指定すると、$ _を使用して本当に簡単です:
git clone git@github.com:npm/npm.git npm-local-dir && cd $_
ただし、長い名前を再入力したくない場合は、少しいですが、sedで実行できます。
git clone git@github.com:pckujawa/pattern-rec.git &&
cd `echo $_ | sed -n -e 's/^.*\/\([^.]*\)\(.git\)*/\1/p'`
編集:まあ、私はマナヴ(以下のコメント)に簡潔に感謝するつもりだった
git clone foo/bar && cd !$:t
ただし、zshでは機能しません(zshがどのように展開するかによって、最初のコマンドがへの入力として扱われなくなります!$
)。何を!$:t
したのか調べなければなりませんでした(Bashシェルでの前進| $ {me:-whatever})。!$
前のコマンドの最後の部分を取得し、:t
「先頭を残してすべてのファイル名コンポーネントを削除します」。良い情報ですが、zshで動作するようにしたいと思います(私はnoglob
成功しませんでした)。
編集:sed
または!$:t
(私にとってはzshでは動作しません)を使用する代わりに、2つの他のオプション(https://unix.stackexchange.com/users/5685/frederik-deweerdtの答えをhttpsで適応させるもの)を見つけました://unix.stackexchange.com/users/129926/henrik-nのコメント):
git clone git@github.com:npm/npm.git && cd $(basename $_ .git)
または
git clone git@github.com:npm/npm.git && cd ${${_%%.git*}##*/}
git clone foo/bar && cd !$:t
.git
場合は、を使用!$:t:r
してフォルダー名を取得できます。
次のようなことができます:
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
たりgit clone .../something dir
、それにそのディレクトリから、CDを推測します。
を入力したgit clone foo; whatever
場合、whatever; git clone foo
またはgit clone --option repo
...
CDing into <project>
とclone_check:cd:17: no such file or directory: <project>
。エラーは、端末を閉じる前に最後に実行したコマンドがと異なるとすぐに消えます$ git clone
。
以下は、上記の回答の適応です OSX
mktemp
追加のパラメーターが必要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
}
お勧めしませんが、このワンライナーを使用できます。
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
「クローンが成功した場合にのみ」ターゲットに侵入することで機能します。
レギュラーgit clone
が行うすべての引数とオプションを受け入れます。
gitラッパーを使用して完了を心配する必要がないか、gitラッパーを削除してgit clone
完了をに再配線できますgit-clone
。
~/.bashrc
ファイルに書き込むことを言及する必要があり(たとえば)、少なくとも私にとっては機能しませんでしたが、行:/usr/bin/git "$@" 2>&1 | tee $tmp