git clone后如何自动cd?

git clone后如何自动cd?

我想在完成某些操作后自动cd转到命令创建的目录。clonegit 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但没有成功)。

编辑:我没有使用sedor !$: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 .../somethinggit clone .../something dir,从中猜测目录并进入其中。

git clone foo; whatever如果您输入或whatever; git clone foogit clone --option repo...,则不起作用。

相关内容