Skip to content

Commit

Permalink
unify the vocabulary and del useless space
Browse files Browse the repository at this point in the history
将 origin 统一译为“远程版本库”,删除多余空白
  • Loading branch information
morstar committed Jun 13, 2015
1 parent 2155728 commit a3d6fa1
Showing 1 changed file with 22 additions and 20 deletions.
42 changes: 22 additions & 20 deletions book/10-git-internals/sections/refspec.asc
Original file line number Diff line number Diff line change
@@ -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]
----
Expand All @@ -18,7 +18,9 @@ $ git remote add origin https://github.com/schacon/simplegit-progit
fetch = +refs/heads/*:refs/remotes/origin/*
----

引用表达式(refspec)的格式是由一个可选的 `+` 号和 `<src>:<dst>` 组成,这里 `<src>` 是远程上的引用格式, `<dst>` 是将要记录在本地的引用格式。可选的 `+` 号告诉 Git 即使不能快速演进,也要强制更新引用格式。默认情况下引用表达式(refspec)会由 `git remote add` 命令自动生成, Git 获取服务器中 `refs/heads/` 下面的所有引用,并将它写入到本地的 `refs/remotes/origin/`中。 所以,如果服务器上有一个 `master` 分支,即可在本地通过下面这种方式来访问分支记录:
引用表达式的格式是由一个可选的 `+` 号和 `<src>:<dst>` 组成,这里 `<src>` 是远程上的引用格式, `<dst>` 是将要记录在本地的引用格式。可选的 `+` 号告诉 Git 即使不能快速演进,也要强制更新引用格式。

默认情况下引用表达式由 `git remote add` 命令自动生成, Git 获取服务器中 `refs/heads/` 下面的所有引用,并将它写入到本地的 `refs/remotes/origin/` 中。 所以,如果服务器上有一个 `master` 分支,即可在本地通过下面这种方式来访问分支记录:

[source,console]
----
Expand All @@ -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]
----
Expand All @@ -54,9 +56,9 @@ From [email protected]:schacon/simplegit
* [new branch] topic -> origin/topic
----

在这个例子中,`master` 分支的拉取操作被拒绝,因为该分支不是一个可以快速演进的引用。可以通过在引用表达式(refspec)之前使用 `+` 号来强制更新。
在这个例子中,`master` 分支的拉取操作被拒绝,因为该分支不是一个可以快速演进的引用。可以通过在引用表达式之前使用 `+` 号来强制更新。

也可以在配置文件中指定多个引用表达式(refspec)。如果想在每次获取时都包括 `master` 和 `experiment` 分支,添加如下两行:
你也可以在配置文件中指定多个引用表达式。如果想在每次获取时都包括 `master` 和 `experiment` 分支,添加如下两行:

[source,ini]
----
Expand All @@ -73,8 +75,8 @@ From [email protected]:schacon/simplegit
fetch = +refs/heads/qa*:refs/remotes/origin/qa*
----

但可以使用命名空间(或文件路径)来达到这个目的。
如您有一个QA团队,他们推送一系列分支。您每次只想获取 `master` 分支和QA团队的所有分支,可以使用如下配置段落
但可以使用命名空间(或目录)来达到这个目的。
如果你有一个 QA 团队,推送了一系列分支,而你只要获取 master 和 QA 团队的这些分支,那么,你可以使用如下的配置

[source,ini]
----
Expand All @@ -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]
----
Expand All @@ -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)的格式是 `<src>:<dst>`, 所以把 `<src>` 留空的意思就是把远程的 `topic` 分支定义为空值,也就是删除它。
因为引用表达式的格式是 `<src>:<dst>`, 所以把 `<src>` 留空的意思就是把远程的 `topic` 分支定义为空值,也就是删除它。

0 comments on commit a3d6fa1

Please sign in to comment.