何かをgit clone
dした後、cd
コマンドによって作成されたディレクトリに自動的にclone
したいと思います。
重要:Pretzo
プロジェクトから自動的に取得するzsh-completionsが壊れるので、コマンドの構文を変更したくない(たとえば、エイリアス/関数を使用)。
[〜#〜] edit [〜#〜]:正しい答えを選択しなかったのは、上記の条件に適合する回答がなかったためです。
私はZSHを使用していますが、他のシェルでの回答も受け入れられます。
関数を作成します。
gclonecd() {
git clone "$1" && cd "$(basename "$1" .git)"
}
(「.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
}
リポジトリのローカル名を指定する場合、 $ _ を使用するのは非常に簡単です。
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 Shellでの前進| $ {me:-whatever} )。 !$
は前のコマンドの最後の部分を取得し、:t
は「先頭のファイル名コンポーネントをすべて削除し、末尾を残します」。良い情報ですが、zshで動作するようにしたいのですが(noglob
を試したところ成功しませんでした)。
編集:sed
または!$: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*}##*/}
これは、OSX
に対する上記の回答の適応です。
mktemp
には追加のパラメーターが必要ですgit clone
はデフォルトでSTDERR
に書き込みます( this を参照)関数:
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
}
POSIXシェルの簡単な解決策は、クローンを作成するディレクトリを明示的に指定し(任意のファイルシステムパス)、それを再利用することです。
git clone <repository> <directory> &&
cd "$_"
そして
cd -
終わったら.
あなたは次のようなことをすることができます:
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
...を入力した場合は機能しません。
これをシェルに含めます:
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
に再配線できます。
私はそれをお勧めしませんが、あなたはcouldこのワンライナーを使用します:
echo 'project' | xargs -I % sh -c 'git clone https://github.com/username/%.git && cd %'