首页 > 编程笔记

GitHub hub命令详解

GitHub 的诞生并不单单影响到了软件开发的相关人员。现在的 GitHub 已经真正成为了一个 Hub,与其相互协作的工具和服务层出不穷,hub 命令就是其中之一。

在使用 GitHub 的过程中,会不可避免地频繁接触到 git 命令。而我们在这里介绍的 hub 命令则是一个封装了 git 命令的命令行工具,能够辅助用户使用 GitHub。

这是个很方便的工具,经常使用 GitHub 的读者请务必一试。

hub 命令概要

hub 命令是由 Chris Wanstrath 带头开发的软件。

在 hub 命令仓库的 README.md 文件中,我们可以看到git + hub = github这样一句话。正如这句话所说,hub 命令将通常的 git 命令进行封装并增加几项功能,就可以调用 GitHub 的 API 发送命令。由于其封装了 git 命令,所以能够执行所有 git 命令的操作。

另外通过 hub 命令功能还得到了扩展,比如指定 GitHub 端仓库时可以用简略路径替代完整路径等。

hub 命令的安装

下面介绍 hub 命令的安装方法。hub 命令需要以下版本的软件:

1) 开始安装 hub 命令

如果是 OS X 系统,可以从版本管理系统的 Homebrew 或 MacPorts 轻松安装。

如果用 Homebrew,则执行下面的命令。

$ brew install hub

如果用 MacPorts,则执行下面的命令。

$ sudo port install hub

只此一步就能完成安装。

使用其他环境的读者请按照下面的流程安装。

$ curl https://hub.github.com/standalone -sLo ~/bin/hub
$ chmod +x ~/bin/hub

通过上述命令下载 hub 命令之后,像下面这样在 shell 的环境路径后面添加 ~/bin。

$ echo 'export PATH="~/bin:$PATH"' >> ~/.bash_profile

重新启动 shell 后,就可以使用 hub 命令了。

2) 确认 hub 运行情况

通过下面的命令确认运行情况。

$ hub ——version
git version 1.8.5.2
hub version 1.10.6

结果中显示了 git 命令与 hub 命令的版本号。

3) 设置别名

使用 hub 命令的最佳实践就是将相应 git 设置成 hub 的别名。hub 命令可以完成 git 命令的所有操作,所以不会影响 git 命令原本的功能。

具体设置方法其实很简单,只需在 shell 的配置文件(.bash_profile 等)中添加下面一句即可。

eval "$(hub alias -s)"

4) 实现 shell 上的功能补全

为了让 hub 命令的功能更加完善,Github 上还发布了面向 bash 和 zsh 的脚本。将正在使用的 shell 与相应脚本组合,就可以让 hub 命令变得更加易用。在某些安装方法中它们会被自动安装。

5) ~/.config/hub

hub 命令在初次访问 GitHub 的 API 时会询问用户名和密码,输入完之后会进行 OAuth 认证,然后我们就可以通过 API 操作 GitHub 了。这时 OAuth Token 会自动保存在~/.config/hub中。各位请慎重保管这个 Token。

——
github.com:
- oauth_token: Oauth Token
user:hirocaster

hub 命令的使用

下面我们来实际使用 hub 命令,看看它为 Git 扩展了哪些功能。

为了与 git 命令区分得更明显,接下来讲解的内容中我们都直接输入 hub 命令。已经将 git 命令设置为别名的读者可以把 hub 的部分替换为 git,运行效果是一样的。当然,直接输入 hub 命令也不会有任何问题。

1) hub clone

使用 hub clone命令,可以省去指定 GitHub 端仓库的部分。

$ hub clone Hello-World

上面这个命令与下面的命令效果相同。

$ git clone git@github.com/用户名/Hello-World.git

如果要指定用户,可以输入以下命令。

$ hub clone octocat/Hello-World

效果与下面这个命令完全相同。

$ git clone git://github.com/octocat/Hello-World.git

2) hub remote add

hub remote add 也可以省略指定 GitHub 端仓库的部分。

$ hub remote add octocat

上面这个命令与

$ git remote add octocat git://github.com/octocat/当前操作仓库的名称.git

的效果完全相同。

3) hub fetch

hub fetch与 hub remote add命令一样,只需输入用户名就可以指定当前操作的仓库执行命令,在此不再赘述。

4) hub cherry-pick

hub cherry-pick 命令只需要输入 URL 就可以获取对应修改并应用到当前分支。在审查代码时,如果发现某个提交中包含值得应用到当前分支的修改,用这个命令可以轻松完成操作。

$ hub cherry-pick https://github.com/hirocaster/github-book/commit/606a76f6831194cfe8a0fdcd6e974a29a4526cbf

这个命令可以将下面两个命令的效果一次性执行。

$ git remote add -f hirocaster git://github.com/hirocaster/github-book.git
$ git cherry-pick 606a76f6831194cfe8a0fdcd6e974a29a4526cbf

5) hub fork

hub fork 命令的功能与 GitHub 页面的 Fork 按钮相同。比如我们 clone 了其他用户的仓库,现在想 Fork 成自己的仓库,只需要执行

$ hub fork

这一命令,就可获得与下面这一系列操作相同的效果(在GitHub上对仓库做Fork处理)。

$ git remote add -f 用户名 git@github.com:当前操作仓库的名称.git

执行完毕后,Fork 出的仓库会被设置成当前本地仓库的远程仓库(以用户名为标识符)。

6) hub pull-request

hub pull-request 命令为我们提供了创建 Pull Request 的功能。利用这个命令创建 Pull Request 可以不必访问 GitHub 页面。

$ hub pull-request -b github-book:master -h hirocaster:index5-draft

使用这条命令,可以从 hirocaster 的 index5-draft 分支向 github-book 的 master 分支发送 Pull Request。执行命令后编辑器会启动,用户可以在编辑器中按照一般 Pull Request 的方式进行描述。第一行将成为 Pull Request 的标题,之后空一行,从第三行开始是 Pull Request 的正文。

如果 index5-draft 的作业内容是已创建的 Issue#123 的作业内容,我们可以直接将 Issue 作为 Pull Request 发送。

$ hub pull-request -i 123 -b github-book:master -h hirocaster:index5-draft

只需附加参数 - i以及 Issue 的编号即可。目前在 Web 上无法像这样将 Issue 直接作为 Pull Request 发送,所以建议各位开发者记下这个技巧。

7) hub checkout

收到 Pull Request 的时候,如果想在本地检查该分支的运行状况,可以使用 hub checkout命令。只需要在命令后添加相应 Pull Request 的 URL,就可以将接收到的分支 checkout。

$ hub checkout https://github.com/hirocaster/wdpress69/pull/208

这个命令与下面两个命令效果相同。

$ git remote add -f -t impression git://github.com/tomamu/wdpress69.git
$ git checkout ——track -B tomamu-impression tomamu/impression

执行之后系统会以Pull Request 发送方的用户名 - 分支名的形式在本地仓库中创建分支。Pull Request 送来的内容已经 checkout 完毕,管理者可以轻松地检查运行状况。

8) hub create

hub create 命令适用于本地已经创建仓库,但 GitHub 端没有创建仓库的情况。

$ hub create

只需要输入上面这个简短的命令,GitHub 端就会创建一个同名仓库,并将其设置为本地仓库的远程仓库。这与下面这一系列操作效果相同(在GitHub上创建仓库)。

$ git remote add origin git@github.com:用户名/当前操作仓库的名称.git

现在只要进行 push,代码就可以放到 GitHub 端的仓库中。需要注意的是,这种方法创建的都是公开仓库,请谨慎使用。

9) hub push

hub push命令支持同时向多个远程仓库进行 push 操作。

$ hub push origin,staging,qa new-feature

这一命令可以对下列远程仓库同时执行 git push命令。
如果遇到需要向多个仓库进行 push 操作的情况,各位不妨试一试。

10) hub browse

hub browse 命令可以在浏览器中打开当前操作的仓库在 GitHub 上对应的仓库页面。

$ hub browse

这个命令与下面的效果相同。

$ open https://github.com/用户名/当前操作仓库的名称

执行后,当前操作仓库的页面会在浏览器中打开。

11) hub compare

如果想查看当前特性分支与 master 分支的差别,可以使用 hub compare 命令。这个命令能够打开 GitHub 上对应的查看差别的页面。

在特性分支下执行下面的命令。

$ hub compare

其效果与执行下面命令的效果相同。

$ open https://github.com/用户名/当前操作仓库的名称/compare/当前分支名

执行后,GitHub 上查看分支间差别的页面就会打开。需要注意的是,这种方法是查看 GitHub 端仓库内的差别,如果最新代码在本地仓库,需要先将分支 push 给远程仓库。

现在各位应该明白,导入 hub 命令可以使熟悉命令行操作的开发者对 GitHub 更加得心应手。我们只介绍了使用频率较高的一些命令,其实 hub 命令并不止这些。

$ hub help

执行上面的命令,可以查看 hub 命令的相关帮助。里面介绍了添加参数后更加细致的操作,各位不妨去看一看。

拓展阅读

我们让 GitHub Enterprise支持 hub 命令。

hub 命令不但可以用于 GitHub,还可以用于 GitHub Enterprise 的操作。使用 GitHub Enterprise 的读者请运行下面的命令。

$ git config ——global ——add hub.host my.example.org

请将my.example.org替换成GitHubEnterprise的主机名

~/.gitconfig 文件中就会添加下面这条设置。

[hub]
host = my.example.org

添加这条设置后,从 GitHub Enterprise 上 clone 来的仓库会以 GitHub Enterprise 为对象执行 hub 命令,而从 GitHub 上 clone 来的仓库仍和原来一样,以 GitHub 为对象执行操作。

推荐阅读