git clone后如何自动cd?

wil*_*yes 51 shell zsh

我想在我做一些事情后自动cdclone命令创建的目录git clone

重要提示:我不想改变命令的语法(例如使用别名/函数),因为它会破坏我从Pretzo项目中自动获得的 zsh 完成。

编辑:我没有选择任何正确答案的原因是因为没有给出符合上述条件的答案。

我使用 ZSH,但在任何其他 shell 中的答案也是可以接受的。

Fre*_*rdt 42

创建一个函数:

gclonecd() {
  git clone "$1" && cd "$(basename "$1" .git)"
}
Run Code Online (Sandbox Code Playgroud)

(适用于带和不带“.git”的链接)

  • @Pat `basename` 也需要一个后缀参数,所以你可以这样做:`git clone $1 && cd $(basename $1 .git)` (13认同)
  • @Wildeyes `git` 无法更改 shell 的工作目录,因此无论哪种方式,您都必须将它包装在一个别名/函数中,该别名/函数可以执行您想要的操作,并使用内置的 `cd` 进行跟踪。如果你想调用 `hub` 而不是 `git`,请在函数中调用。如果您希望它只影响 `clone` 命令,请检查函数中的操作。等等。 (5认同)
  • 我想继续使用 `git clone`,因为如果我不使用 `git`,我将不得不更改所有工具。[Hub](http://hub.github.com) 别名为 git,oh-my-zsh 提供自动补全等... (2认同)

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)

  • 当心。它是`git [flags] command [arguments]`,所以在某些位置盲目要求`clone`会失败。 (3认同)
  • @Wildeyes 是的:有一个位于 RAM 中的 `/tmp` 卷,就像任何现代 Linux 通过 tmpfs 所做的一样。无论如何,当你刚刚完成一个 git clone,它创建目录并将数百个文件写入磁盘时,你为什么要关心写入磁盘...... (2认同)

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)