我想在我做一些事情后自动cd
到clone
命令创建的目录git clone
。
重要提示:我不想改变命令的语法(例如使用别名/函数),因为它会破坏我从Pretzo
项目中自动获得的 zsh 完成。
编辑:我没有选择任何正确答案的原因是因为没有给出符合上述条件的答案。
我使用 ZSH,但在任何其他 shell 中的答案也是可以接受的。
Fre*_*rdt 42
创建一个函数:
gclonecd() {
git clone "$1" && cd "$(basename "$1" .git)"
}
Run Code Online (Sandbox Code Playgroud)
(适用于带和不带“.git”的链接)
Kaz*_*Kaz 23
git clone
需要一个额外的参数:要使用的目录。您可以使用git clone URL .
Then将其克隆到当前工作目录中,无需更改工作目录;你已经在那里了。
如果您真的希望该git
命令实际更改工作目录,则可以将其更改为git
在必要时调用 real 的函数:
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
}
Run Code Online (Sandbox Code Playgroud)
Pat*_*Pat 13
如果您提供 repo 的本地名称,则使用$_真的很容易:
git clone git@github.com:npm/npm.git npm-local-dir && cd $_
Run Code Online (Sandbox Code Playgroud)
但是如果你不想重新输入长名称,这有点难看,但用 sed 是可行的:
git clone git@github.com:pckujawa/pattern-rec.git &&
cd `echo $_ | sed -n -e 's/^.*\/\([^.]*\)\(.git\)*/\1/p'`
Run Code Online (Sandbox Code Playgroud)
编辑:嗯,我要感谢 Manav(下面的评论)的简洁
git clone foo/bar && cd !$:t
Run Code Online (Sandbox Code Playgroud)
但它在 zsh 中不起作用(关于zsh 如何进行扩展导致它不将第一个命令视为输入!$
)。我不得不查看做了什么!$:t
(在 Bash Shell 中前进 | ${me:-whatever})。!$
抓取上一个命令的最后一部分,:t
并将“删除所有前导文件名组件,保留尾部。” 很好的信息,但我希望我可以让它与 zsh 一起工作(我尝试noglob
没有成功)。
编辑:不要使用sed
或!$:t
(这并不在zsh的工作,对我来说是这样),我发现了其他两个选项(一个适应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)
Run Code Online (Sandbox Code Playgroud)
或者
git clone git@github.com:npm/npm.git && cd ${${_%%.git*}##*/}
Run Code Online (Sandbox Code Playgroud)