需求背景:需要在终端打开目前项目的 GitHub 主页

实现效果

获取 GitHub 链接

使用 git config 获取当前目录的 git 配置信息,再使用 get 取出 远程地址的 URL 即可。

git config --get remote.origin.url
https://github.com/JamesHopbourn/Apple-Automation

但是除了使用 https 协议之外,还有的是使用 ssh 协议来拉取项目。使用 ssh 协议的项目的远程地址如下所示。

git config --get remote.origin.url
git@github.com:JamesHopbourn/Apple-Automation.git

如果在 ssh 的 config 文件中配置了 Host,它还有可能是这样的 ssh 地址格式。

hopbourn:JamesHopbourn/CompanyPorject.git

处理链接

对于以上三种情况,需要将它们的协议转为 https 才可以正常打开对应的网页。此处可以使用 sed 命令配合 b 指令处理。下面这条命令可以拆为两个部分来看,/https/b 表示不去匹配 https 开头的行,如果是其他情况才会进入后面的语句。后面的语句中 ^.*: 是代表匹配从开头到最后一个 : 的字符串,然后将它替换为 https://github.com/ 字符串。

sed '/https/b ; s|^.*:|https://github.com/|

验证一下命令的正确性,可以看出三种类型的链接都可以被正确处理,符合预期效果。最后有无 .git 对链接没有影响,在打开 GitHub 链接后会自动去掉。

echo 'https://github.com/JamesHopbourn/Apple-Automation'|sed '/https/b ; s|^.*:|https://github.com/|'
https://github.com/JamesHopbourn/Apple-Automation

echo 'git@github.com:JamesHopbourn/Apple-Automation.git'|sed '/https/b ; s|^.*:|https://github.com/|'
https://github.com/JamesHopbourn/Apple-Automation.git

echo 'hopbourn:JamesHopbourn/CompanyPorject.git'|sed '/https/b ; s|^.*:|https://github.com/|'
https://github.com/JamesHopbourn/CompanyPorject.git

打开链接

使用 macOS 的 open 命令可以打开一个网页链接,在 Linux 系统下这个命令是 xdg-open。但是由于 open 不支持 stdin,需要使用 xargs 来辅助传递 URL 地址。举个例子,使用下面这条命令就可以打开少数派的网站。

echo https://sspai.com|xargs open

但是下面这条命令由于没有 xargs 传递 URL 参数,open 不知道要打开什么链接,就会出错。通过这个简单的例子就能理解到 xargs 的基本使用方法。

echo https://sspai.com|open

那么同样的道理,将上面两个步骤和 xargs open 命令拼接起来,就实现了直接打开当前项目的 GitHub 主页,整合后的命令如下所示:

git config --get remote.origin.url|sed '/https/b;s|^.*:|https://github.com/|'|xargs open

alias 命令

像上面这样一长串的命令使用起来并不是非常方便,所以可以考虑给他起个别名,也就是所谓的 alias。最简单的方法是可以写在 ~/.zshrc 文件里。但是我喜欢把命令归类放在一起,由于配置了 oh-my-zsh 的 git 插件,所以可以考虑直接把这条 alias 写在 git.plugin.zsh 里。打开 git.plugin.zsh 搜索 git config,可以看到插件自带了 gcf alias。所以可以考虑直接在这条命令下面加上自定义的 alias。

使用下面这条 gsed 命令实现直接插入 alias ,该命令会先匹配出现 gcf= 字符的行,在这行的下面插入自定义的 gop alias,使用 -i 参数代表直接原地修改文件保存。如果还未安装 gsed 命令,可以通过 brew install gnu-sed 安装

gsed -i "/ gcf=/a alias gop=\"git config --get remote.origin.url|sed '/https/b;s|^.*:|https://github.com/|'|xargs open\"" ~/.oh-my-zsh/plugins/git/git.plugin.zsh

可能有读者疑问,这样复制粘贴就完成的事情,有必要专门再写一条命令来处理吗?在多数情况是下这样,但是作者自己有整理了一份重装系统后运行的命令,所有的命令复制粘贴就全自动完成了,所以在这种情况下,这样的命令就是有意义的。

至此,再重新开启终端后,在 git 工作目录里使用 gop 就可以直接打开项目的 GitHub 主页了,power~

 

参考文章