这是懒惰的程序员请求。我想创建一个shell脚本自动执行以下过程:
git clone <remote-repo-url>
cd <cloned-folder>
open <cloned-folder>
因此,这里的想法是克隆一个网址,然后立即cd
进入cloned-folder
。这里的技巧是从url模式中识别cloned-folder
。
现在我们可以假设url结构采用这种模式.../<cloned-folder>.git
,即网址。
我想知道我们是否可以使用awk
或类似的工具。我猜的部分是找到一个合适的regex
,我猜。
USE CASE :这里的用例是如果你克隆了一个url,你想尽快进入repofolder。如果您要运行git
或git log
之类的mate .
命令,这是我们99%的时间做的预先要求。
提前致谢。
答案 0 :(得分:13)
执行此操作的bash函数(也适用于zsh):
function lazyclone {
url=$1;
reponame=$(echo $url | awk -F/ '{print $NF}' | sed -e 's/.git$//');
git clone $url $reponame;
cd $reponame;
}
awk
命令在最后/
之后打印部件(例如从http://example.com/myrepo.git
到myrepo.git
)。 sed
命令删除尾随.git
用法:
$ pwd
~/
$ lazyclone https://github.com/dbr/tvdb_api.git
tvdb_api
Cloning into 'tvdb_api'...
remote: Counting objects: 1477, done.
remote: Compressing objects: 100% (534/534), done.
remote: Total 1477 (delta 952), reused 1462 (delta 940)
Receiving objects: 100% (1477/1477), 268.48 KiB | 202 KiB/s, done.
Resolving deltas: 100% (952/952), done.
$ pwd
~/tvdb_api
答案 1 :(得分:2)
使用git clone,您可以指定要克隆到的文件夹,而不是允许自动命名。
dir=myclone
git clone git://somerepo "$dir"
cd "$dir"
open "$dir"
答案 2 :(得分:1)
@ dbr答案的改进:
function lazyclone {
reponame=${1##*/}
reponame=${reponame%.git}
git clone "$1" "$reponame";
cd "$reponame";
}
借助Bash的参数扩展,我们可以摆脱awk
和sed
。
答案 3 :(得分:0)
bash参数版本相当不错,我选择了basename
因为它看起来更干净
function gclocd {
# git clone and enter the cloned file
if [[ -z "$2" ]]; then
reponame=$(basename "$1" ".git");
else
reponame=$2;
fi
git clone "$1" "$reponame";
cd "$reponame";
}
我使用短暂的令人难忘的tab-completable函数名称来处理这样的一堆事情,并将它们作为别名/函数放在我的.bashrc
中,例如gcmmt
git commit -m
。 lazy
可能已经是shell中事物的前缀,这意味着每次输入都要多一点......
答案 4 :(得分:0)
我们可以cd
进入最新创建的目录,而不是从url获取目录名。这是相应的shell脚本:
gclcd() {
git clone --recursive $* && cd "$(ls -t | head -1)"
}