7

这是懒惰的程序员要求。我想创建一个 shell 脚本自动执行以下过程:

git clone <remote-repo-url>
cd <cloned-folder>
open <cloned-folder> 

所以这里的想法是克隆一个 URL,然后立即cd进入cloned-folder. cloned-folder这里的诀窍是从 url 模式中识别。

现在我们可以假设 url 结构是这种模式,.../<cloned-folder>.git即 url。

我想知道我们是否真的可以使用使用awk或类似的工具。我想我被困的部分是找到一个合适的regex

用例:这里的用例是如果你克隆一个 url,你希望尽快进入 repofolder 如果您想运行任何git命令,git log或者mate .我们 99% 的时间都在执行,这是先决条件。

提前致谢。

4

5 回答 5

15

bash 函数来做到这一点(也适用于 zsh):

function lazyclone {
    url=$1;
    reponame=$(echo $url | awk -F/ '{print $NF}' | sed -e 's/.git$//');
    git clone $url $reponame;
    cd $reponame;
}

awk命令打印最后一部分之后的部分/(例如 fromhttp://example.com/myrepo.gitmyrepo.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
于 2012-08-21T16:25:08.180 回答
2

使用 git clone,您可以指定要克隆到的文件夹,而不是允许它自动命名。

dir=myclone
git clone git://somerepo "$dir"
cd "$dir"
open "$dir"
于 2012-08-21T16:02:34.527 回答
1

@dbr 回答的改进:

function lazyclone {
    reponame=${1##*/}
    reponame=${reponame%.git}
    git clone "$1" "$reponame";
    cd "$reponame";
}

借助 Bash 的参数扩展,我们可以摆脱awksed

于 2015-08-31T05:01:13.063 回答
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";
}

我为一堆这样的事情使用简短的、令人难忘的制表符可完成的函数名称,并将它们.bashrc作为别名/函数放在我的中,例如gcmmtfor git commit -m. lazy很可能已经是你 shell 中事物的前缀,这意味着每次都要输入更多内容......

于 2015-11-24T23:24:11.250 回答
0

我们可以直接cd进入最新创建的目录,而不是从 url 获取目录名称。下面是对应的shell脚本:

gclcd() {
    git clone --recursive $* && cd "$(ls -t | head -1)"
}
于 2017-06-05T04:09:26.537 回答