diff --git a/book/10-git-internals/sections/refspec.asc b/book/10-git-internals/sections/refspec.asc index 2b9d504b..691e4328 100644 --- a/book/10-git-internals/sections/refspec.asc +++ b/book/10-git-internals/sections/refspec.asc @@ -1,15 +1,15 @@ -[[_引用表达式]] +[[_refspec]] === 引用表达式(Refspec) 纵观全书,我们已经使用过一些诸如远程分支到本地引用的简单映射方式,但是还有更复杂的。 -假设你添加了这样一个远程: +假设你添加了这样一个远程版本库: [source,console] ---- $ git remote add origin https://github.com/schacon/simplegit-progit ---- -上面的命令将在你的 `.git/config` 文件中添加一个小节,指定了远程的名称 (`origin`),远程仓库的URL地址,和用于获取操作的引用表达式(Refspec): +上面的命令将在你的 `.git/config` 文件中添加一个小节,指定了远程版本库的名称(`origin`)、URL 地址、以及用于获取的引用表达式(Refspec): [source,ini] ---- @@ -18,7 +18,9 @@ $ git remote add origin https://github.com/schacon/simplegit-progit fetch = +refs/heads/*:refs/remotes/origin/* ---- -引用表达式(refspec)的格式是由一个可选的 `+` 号和 `:` 组成,这里 `` 是远程上的引用格式, `` 是将要记录在本地的引用格式。可选的 `+` 号告诉 Git 即使不能快速演进,也要强制更新引用格式。默认情况下引用表达式(refspec)会由 `git remote add` 命令自动生成, Git 获取服务器中 `refs/heads/` 下面的所有引用,并将它写入到本地的 `refs/remotes/origin/`中。 所以,如果服务器上有一个 `master` 分支,即可在本地通过下面这种方式来访问分支记录: +引用表达式的格式是由一个可选的 `+` 号和 `:` 组成,这里 `` 是远程上的引用格式, `` 是将要记录在本地的引用格式。可选的 `+` 号告诉 Git 即使不能快速演进,也要强制更新引用格式。 + +默认情况下引用表达式由 `git remote add` 命令自动生成, Git 获取服务器中 `refs/heads/` 下面的所有引用,并将它写入到本地的 `refs/remotes/origin/` 中。 所以,如果服务器上有一个 `master` 分支,即可在本地通过下面这种方式来访问分支记录: [source,console] ---- @@ -29,21 +31,21 @@ $ git log refs/remotes/origin/master 上面的三个命令作用相同,因为 Git 把它们都扩展成 `refs/remotes/origin/master`。 -如果想让 Git 每次只拉取远程的 `master` 分支,而不是远程的所有分支,可以把 `fetch` 行修改为: +如果想让 Git 每次只拉取远程的 `master` 分支,而不是所有分支,可以把 fetch 行修改为: [source] ---- fetch = +refs/heads/master:refs/remotes/origin/master ---- -这只是针对远程的 `git fetch` 操作的默认引用表达式(refspec)。而如果只想做一次该操作,也可以在命令行上指定引用表达式(refspec)。拉取远程的 `master` 分支到本地的 `origin/mymaster` 分支,可以运行: +这只是针对远程的 `git fetch` 操作的默认引用表达式。如果只想执行一次该操作,可以在命令行指定引用表达式。将远程的 `master` 分支拉取到本地的 `origin/mymaster` 分支,可以运行: [source,console] ---- $ git fetch origin master:refs/remotes/origin/mymaster ---- -也可以指定多个引用表达式(refspec)。像下面的命令行,可以一次拉取远程的多个分支: +你也可以指定多个引用表达式。使用命令行,你可以按照如下的方式拉取多个分支: [source,console] ---- @@ -54,9 +56,9 @@ From git@github.com:schacon/simplegit * [new branch] topic -> origin/topic ---- -在这个例子中,`master` 分支的拉取操作被拒绝,因为该分支不是一个可以快速演进的引用。可以通过在引用表达式(refspec)之前使用 `+` 号来强制更新。 +在这个例子中,`master` 分支的拉取操作被拒绝,因为该分支不是一个可以快速演进的引用。可以通过在引用表达式之前使用 `+` 号来强制更新。 -也可以在配置文件中指定多个引用表达式(refspec)。如果想在每次获取时都包括 `master` 和 `experiment` 分支,添加如下两行: +你也可以在配置文件中指定多个引用表达式。如果想在每次获取时都包括 `master` 和 `experiment` 分支,添加如下两行: [source,ini] ---- @@ -73,8 +75,8 @@ From git@github.com:schacon/simplegit fetch = +refs/heads/qa*:refs/remotes/origin/qa* ---- -但可以使用命名空间(或文件路径)来达到这个目的。 -如您有一个QA团队,他们推送一系列分支。您每次只想获取 `master` 分支和QA团队的所有分支,可以使用如下配置段落: +但可以使用命名空间(或目录)来达到这个目的。 +如果你有一个 QA 团队,推送了一系列分支,而你只要获取 master 和 QA 团队的这些分支,那么,你可以使用如下的配置: [source,ini] ---- @@ -84,19 +86,20 @@ fetch = +refs/heads/qa*:refs/remotes/origin/qa* fetch = +refs/heads/qa/*:refs/remotes/origin/qa/* ---- -如果工作流很复杂,有QA团队推送的分支、开发人员推送的分支、还有集成团队推送并且在远程分支上协作,可以为他们创建各自的命名空间解决类似问题。 +如果工作流很复杂,有 QA 团队推送的分支、开发人员推送的分支、还有集成团队推送并且在远程分支上协作,可以为他们创建各自的命名空间解决类似问题。 -[[_推送_引用表达式]] -==== 推送引用表达式(refspec) +[[_pushing_refspecs]] +==== 推送引用表达式 -采用命名空间的方式来获取分支是个好主意,但QA组成员如何将他们的分支开始推送到 `qa/` 空间里面的呢?答案是通过引用表达式(refspec)的推送来完成。如果QA团队想把他们的 `master` 分支推送到远程服务器的 `qa/master` 分支上,可以运行: +采用命名空间的方式来获取分支是个好主意,但 QA 团队一开始如何将他们的分支推送到 `qa/` 命名空间呢?答案是通过引用表达式的推送来完成。 +如果 QA 团队想把他们的 `master` 分支推送到远程服务器的 `qa/master` 分支上,可以运行: [source,console] ---- $ git push origin master:refs/heads/qa/master ---- -如果他们希望 `Git` 每次运行 `git push origin` 时都如上这样推送,他们可以在配置文件中添加一个 `push` 值: +如果他们希望 Git 每次运行 `git push origin` 时都如上这样推送,他们可以在配置文件中添加一个 `push` 值: [source,ini] ---- @@ -106,16 +109,15 @@ $ git push origin master:refs/heads/qa/master push = refs/heads/master:refs/heads/qa/master ---- -同样的,这就会让 `git push origin` 默认就把本地的 `master` 分支推送到远程的 `qa/master` 分支上。 +同样的,这会让 `git push origin` 默认把本地 `master` 分支推送到远程 `qa/master` 分支。 -==== Deleting References ==== 删除引用 -您也可以使用引用表达式(refspec)来删除远程服务器的引用,运行如下命令: +你也可以使用引用表达式来删除远程服务器的引用,运行如下命令: [source,console] ---- $ git push origin :topic ---- -因为引用表达式(refspec)的格式是 `:`, 所以把 `` 留空的意思就是把远程的 `topic` 分支定义为空值,也就是删除它。 +因为引用表达式的格式是 `:`, 所以把 `` 留空的意思就是把远程的 `topic` 分支定义为空值,也就是删除它。