我想在完成某些操作后自动cd
转到命令创建的目录。clone
git clone
重要的:我不想更改命令的语法(例如使用别名/函数),因为它会破坏我从项目自动获得的 zsh 完成Pretzo
。
编辑:我之所以没有选择任何正确的答案,是因为没有给出符合上述条件的答案。
我使用 ZSH,但任何其他 shell 中的答案也是可以接受的。
答案1
创建一个函数:
gclonecd() {
git clone "$1" && cd "$(basename "$1" .git)"
}
(适用于带和不带“.git”的链接)
答案2
git clone
需要一个附加参数:要使用的目录。您可以将其克隆到当前工作目录中,然后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'`
编辑:嗯,我要感谢马纳夫(下面的评论)的简洁
git clone foo/bar && cd !$:t
但它在 zsh 中不起作用(一些有关zsh 如何进行扩展导致它不将第一个命令视为 ) 的输入!$
。我必须查一下!$:t
做了什么(在 Bash Shell 中取得进展 | ${我:-随便})。!$
抓取上一个命令的最后一部分,:t
并将“删除所有前导文件名组件,留下尾部”。很好的信息,但我希望我可以让它与 zsh 一起工作(我尝试过noglob
但没有成功)。
编辑:我没有使用sed
or !$:t
(这在 zsh 中不起作用,无论如何对我来说),而是找到了另外两个选项(一个适应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
或git clone .../something dir
,从中猜测目录并进入其中。
git clone foo; whatever
如果您输入或whatever; git clone foo
或git clone --option repo
...,则不起作用。