Answers:
创建一个函数:
gclonecd() {
git clone "$1" && cd "$(basename "$1" .git)"
}
(适用于带有和不带有“ .git”的链接)
git无法更改外壳程序的工作目录,因此无论哪种方式,您都必须将其包装在一个别名/函数中,该别名/函数可以执行您想要的操作,并通过内置函数进行处理cd。如果要调用hub而不是git,请在函数中进行调用。如果希望它仅影响clone命令,请检查函数中的操作。等等
basename git@github.com:pckujawa/pattern-rec.gitpattern-rec.git的结果-克隆时是否只保留了.git扩展名?
basename也带有后缀参数,因此您可以执行以下操作:git clone $1 && cd $(basename $1 .git)
git clone需要一个附加参数:要使用的目录。您可以使用使其克隆到当前工作目录中,git clone URL . 然后,无需更改工作目录。你已经在那里。
如果您确实希望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
}
/tmp在RAM中的卷,就像任何现代Linux通过tmpfs所做的一样。无论如何,当您刚刚完成git clone(它会创建目录并将数百个文件写入磁盘)时,为什么还要关心写入磁盘呢?
git [flags] command [arguments],所以盲目要求clone在某个位置将失败。
which git git(){... $ git_real_home“ $ @” | tee $ tmp
如果提供仓库的本地名称,使用$ _真的很容易:
git clone git@github.com:npm/npm.git npm-local-dir && cd $_
但是,如果您不想重新输入长名称,那么使用sed可能有点丑陋但可行:
git clone git@github.com:pckujawa/pattern-rec.git &&
cd `echo $_ | sed -n -e 's/^.*\/\([^.]*\)\(.git\)*/\1/p'`
编辑:好吧,我要感谢马纳夫(下面的评论)的简洁
git clone foo/bar && cd !$:t
但它在zsh中不起作用(有关zsh如何进行扩展的内容导致它不会将第一个命令视为输入!$)。我不得不查看做了什么!$:t(在Bash Shell中前进| $ {me:-whatever})。!$抓取上一个命令的最后一部分,然后:t将“删除所有开头的文件名组件,不留尾巴。” 很好的信息,但是我希望我可以将其与zsh一起使用(我尝试noglob没有成功)。
编辑:而不是使用sed或!$:t(无论如何对我来说都不在zsh中起作用),我发现了另外两个选项(一个使用https调整了https://unix.stackexchange.com/users/5685/frederik-deweerdt的答案)://unix.stackexchange.com/users/129926/henrik-n的评论):
git clone git@github.com:npm/npm.git && cd $(basename $_ .git)
要么
git clone git@github.com:npm/npm.git && cd ${${_%%.git*}##*/}
git clone foo/bar && cd !$:t
.git可以使用!$:t:r来获取文件夹名称。
您可以执行以下操作:
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...
CDing into <project>和clone_check:cd:17: no such file or directory: <project>。一旦您在关闭终端之前运行的最后一个命令不同于,该错误就会消失$ git clone。
这是上述答案的改编 OSX
mktemp 需要其他参数git clone写STDERR在默认情况下(见本)功能:
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
}
包括在您的外壳中:
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。
~/.bashrc文件上写入该功能(例如),至少对我来说它不起作用,我需要用替换该功能来修复它。线路:/usr/bin/git "$@" 2>&1 | tee $tmp