6.3 维护项目
维护项目
现在我们可以很方便地向一个项目贡献内容,来看一下另一个方面的内容:创建、维护和管理你自己的项目。
创建新的版本库
让我们创建一个版本库来分享我们的项目。通过点击面板右侧的“New repository”按钮,或者顶部工具条你用户名旁边的 +
按钮来开始我们的旅程。 参见 Figure 6-30。
Figure 6-30. 这是 “New repository” 下拉列表.
这会带你到 “new repository” 表单:
“检出远程分支”._ 讲到它。如果你愿意,你可以创建并切换到一个主题分支,然后运行这个命令把合并请求合并进来。
还有一些有趣的 URL,像 .diff
和 .patch
,就像你猜的那样,它们提供 diff 和 patch 的标准版本。你可以技术性地用下面的方法合并“合并请求”:
$ curl http://github.com/tonychacon/fade/pull/1.patch | git am
在合并请求上进行合作
就像我们在 “GitHub 流程”,_ 说过的,现在你可以跟开启合并请求的人进行会话。你既可以对某些代码添加注释,也可以对整个提交添加注释或对整个合并请求添加注释,在任何地方都可以用 GitHub Flavored Markdown。
每次有人在合并请求上进行注释你都会收到通知邮件,通知你哪里发生改变。他们都会包含一个到改变位置的链接,你可以直接在邮件中对合并请求进行注释。
“引用规格” 有更多的细节说明。
实际上 GitHub 在服务器上把合并请求分支视为一种 “假分支”。默认情况下你克隆时不会得到它们,但它们还是隐式地存在,你可以很容易地访问到它们。
为了展示这个,我们要用到一个叫做 ls-remote
的低级命令(通常被叫做“plumbing”,我们会在 “底层命令和高层命令” 读到更多相关内容)。这个命令在日常 Git 操作中基本不会用到,但在显示服务器上有哪些引用(reference)时很管用。
如果在我们之前用过的 “blink” 版本库上使用这个命令,我们会得到一个版本库里所有的分支,标签和其它引用(reference)的列表。
$ git ls-remote https://github.com/schacon/blink
10d539600d86723087810ec636870a504f4fee4d HEAD
10d539600d86723087810ec636870a504f4fee4d refs/heads/master
6a83107c62950be9453aac297bb0193fd743cd6e refs/pull/1/head
afe83c2d1a70674c9505cc1d8b7d380d5e076ed3 refs/pull/1/merge
3c8d735ee16296c242be7a9742ebfbc2665adec1 refs/pull/2/head
15c9f4f80973a2758462ab2066b6ad9fe8dcf03d refs/pull/2/merge
a5a7751a33b7e86c5e9bb07b26001bb17d775d1a refs/pull/4/head
31a45fc257e8433c8d8804e3e848cf61c9d3166c refs/pull/4/merge
当然,如果你在你自己的版本库或其它你想检查的远程版本库中使用 git ls-remote origin
,它会显示相似的内容。
如果版本库在 GitHub 上并且有打开的合并请求,你会得到一些以 refs/pull/
开头的引用。它们实际上是分支,但因为它们不在 refs/heads/
中,所以正常情况下你克隆时不会从服务器上得到它们 — 抓取过程正常情况下会忽略它们。
每个合并请求有两个引用 - 其中以 /head
结尾的引用指向的提交记录与合并请求分支中的最后一个提交记录是同一个。所以如果有人在我们的版本库中开启了一个合并请求,他们的分支叫做 bug-fix
,指向 a5a775
这个提交记录,那么在 我们的 版本库中我们没有 bug-fix
分支(因为那是在他们的 fork 中),但我们 可以 有一个 pull/<pr#>/head
指向 a5a775
。这意味着我们可以很容易地拉取每一个合并请求分支而不用添加一堆 remote。
现在,你可以像直接抓取引用一样抓取那些分支或提交。
$ git fetch origin refs/pull/958/head
From https://github.com/libgit2/libgit2
* branch refs/pull/958/head -> FETCH_HEAD
这告诉 Git: “连接到 origin
这个 remote,下载名字为 refs/pull/958/head
的引用。”Git 高高兴兴去执行,下载构建那个引用需要的所有内容,然后把指针指向 .git/FETCH_HEAD
下面你想要的提交记录。然后你可以用 git merge FETCH_HEAD
把它合并到你想进行测试的分支,但那个合并的提交信息看起来有点怪。然而,如果你需要审查 一大批 合并请求,这样操作会很麻烦。
还有一种方法可以抓取 所有的 合并请求,并且在你连接到远程(remote)的时候保持更新。用你最喜欢的编辑器打开 .git/config
,查找 origin
远程(remote)。看起来差不多像下面这样:
[remote "origin"]
url = https://github.com/libgit2/libgit2
fetch = +refs/heads/*:refs/remotes/origin/*
以 fetch =
开头的行是一个 “refspec.”它是一种把 remote 的名称映射到你本地 .git
目录的方法。这一条(就是上面的这一条)告诉 Git,“remote 上 refs/heads
下面的内容在我本地版本库中都放在 refs/remotes/origin
。”你可以把这一段修改一下,添加另一个 refspec:
[remote "origin"]
url = https://github.com/libgit2/libgit2.git
fetch = +refs/heads/*:refs/remotes/origin/*
fetch = +refs/pull/*/head:refs/remotes/origin/pr/*
最后一行告诉 Git: “所有看起来像 refs/pull/123/head
的引用应该在本地版本库像 refs/remotes/origin/pr/123
一样存储”现在,如果你保存那个文件,执行 git fetch
:
$ git fetch
# …
* [new ref] refs/pull/1/head -> origin/pr/1
* [new ref] refs/pull/2/head -> origin/pr/2
* [new ref] refs/pull/4/head -> origin/pr/4
# …
现在所有的合并请求在本地像分支一样展现,它们是只读的,当你执行抓取时它们也会更新。这让在本地测试合并请求中的代码变得超级简单:
$ git checkout pr/2
Checking out files: 100% (3769/3769), done.
Branch pr/2 set up to track remote branch pr/2 from origin.
Switched to a new branch 'pr/2'
你的鹰眼系统会发现在 refspec 的 remote 部分的结尾有个 head
。在 GitHub 那边也有一个 refs/pull/#/merge
引用,它代表的是如果你在网站上按了 “merge” 按钮对应的提交记录。这甚至让你可以在按按钮之前就测试这个合并。
合并请求之上的合并请求
你不仅可以在主分支或者说 master
分支上开启合并请求,实际上你可以在网络上的任何一个分支上开启合并请求。其实,你甚至可以在另一个合并请求上开启一个合并请求。
如果你看到一个合并请求在向正确的方向发展,然后你想在这个合并请求上做一些修改或者你不太确定这是个好主意,或者你没有目标分支的推送权限,你可以直接在合并请求上开启一个合并请求。
当你开启一个合并请求时,在页面的顶端有一个框框显示你要合并到哪个分支和你从哪个分支合并过来的。如果你点击那个框框右边的 “Edit” 按钮,你不仅可以改变分支,还可以选择哪个 fork。
Figure 6-38. 输入 @ 来提醒某人.
你也可以提醒不在列表中的用户,但是通常自动补全用起更快。
当你发布了一个带用户提醒的评论,那个用户会收到通知。这意味着把人们拉进会话中要比让他们投票有效率得多。对于 GitHub 上的合并请求,人们经常把他们团队或公司中的其它人拉来审查问题或合并请求。
如果有人收到了合并请求或问题的提醒,他们会"订阅"它,后面有新的活动发生他们都会持续收到提醒。如果你是合并请求或者问题的发起方你也会被订阅上,比如你在关注一个版本库或者你评论了什么东西。如果你不想再收到提醒,在页面上有个 “Unsubscribe” 按钮,点一下就不会再收到更新了。
Figure 6-40. 通知中心选项.
有两个选项,通过"邮件(Email)"和通过"网页(Web)",你可以选用一个或者都不选或者都选。
网页通知
网页通知只在 GitHub 上存在,你也只能在 GitHub 上查看。如果你打开了这个选项并且有一个你的通知,你会在你屏幕上方的通知图标上看到一个小蓝点。参见 Figure 6-41。
更多建议: