這本書讀到這里,你已經使用過一些簡單的遠程分支到本地引用的映射方式了,這種映射可以更為復雜。 假設你像這樣添加了一項遠程倉庫:
`$ git remote add origin git@github.com:schacon/simplegit-progit.git`
它在你的 .git/config 文件中添加了一節,指定了遠程的名稱 (origin), 遠程倉庫的URL地址,和用于獲取操作的 Refspec:
~~~
[remote "origin"]
url = git@github.com:schacon/simplegit-progit.git
fetch = +refs/heads/*:refs/remotes/origin/*
~~~
Refspec 的格式是一個可選的 + 號,接著是 <src>:<dst> 的格式,這里 <src> 是遠端上的引用格式, <dst> 是將要記錄在本地的引用格式。可選的 + 號告訴 Git 在即使不能快速演進的情況下,也去強制更新它。
缺省情況下 refspec 會被 git remote add 命令所自動生成, Git 會獲取遠端上 refs/heads/ 下面的所有引用,并將它寫入到本地的 refs/remotes/origin/. 所以,如果遠端上有一個 master 分支,你在本地可以通過下面這種方式來訪問它的歷史記錄:
~~~
$ git log origin/master
$ git log remotes/origin/master
$ git log refs/remotes/origin/master
~~~
它們全是等價的,因為 Git 把它們都擴展成 `refs/remotes/origin/master.`
如果你想讓 Git 每次只拉取遠程的 master 分支,而不是遠程的所有分支,你可以把 fetch 這一行修改成這樣:
`fetch = +refs/heads/master:refs/remotes/origin/master`
這是 git fetch 操作對這個遠端的缺省 refspec 值。而如果你只想做一次該操作,也可以在命令行上指定這個 refspec. 如可以這樣拉取遠程的 master 分支到本地的 origin/mymaster 分支:
`$ git fetch origin master:refs/remotes/origin/mymaster`
你也可以在命令行上指定多個 refspec. 像這樣可以一次獲取遠程的多個分支:
~~~
$ git fetch origin master:refs/remotes/origin/mymaster \
topic:refs/remotes/origin/topic
From git@github.com:schacon/simplegit
! [rejected] master -> origin/mymaster (non fast forward)
* [new branch] topic -> origin/topic
~~~
在這個例子中, master 分支因為不是一個可以快速演進的引用而拉取操作被拒絕。你可以在 refspec 之前使用一個 + 號來重載這種行為。
你也可以在配置文件中指定多個 refspec. 如你想在每次獲取時都獲取 master 和 experiment 分支,就添加兩行:
~~~
[remote "origin"]
url = git@github.com:schacon/simplegit-progit.git
fetch = +refs/heads/master:refs/remotes/origin/master
fetch = +refs/heads/experiment:refs/remotes/origin/experiment
~~~
但是這里不能使用部分通配符,像這樣就是不合法的:
`fetch = +refs/heads/qa*:refs/remotes/origin/qa*`
但無論如何,你可以使用命名空間來達到這個目的。如你有一個QA組,他們推送一系列分支,你想每次獲取 master 分支和QA組的所有分支,你可以使用這樣的配置段落:
~~~
[remote "origin"]
url = git@github.com:schacon/simplegit-progit.git
fetch = +refs/heads/master:refs/remotes/origin/master
fetch = +refs/heads/qa/*:refs/remotes/origin/qa/*
~~~
如果你的工作流很復雜,有QA組推送的分支、開發人員推送的分支、和集成人員推送的分支,并且他們在遠程分支上協作,你可以采用這種方式為他們創建各自的命名空間。
## 推送 Refspec
采用命名空間的方式確實很棒,但QA組成員第1次是如何將他們的分支推送到 qa/ 空間里面的呢?答案是你可以使用 refspec 來推送。
如果QA組成員想把他們的 master 分支推送到遠程的 qa/master 分支上,可以這樣運行:
`$ git push origin master:refs/heads/qa/master`
如果他們想讓 Git 每次運行 git push origin 時都這樣自動推送,他們可以在配置文件中添加 push 值:
~~~
[remote "origin"]
url = git@github.com:schacon/simplegit-progit.git
fetch = +refs/heads/*:refs/remotes/origin/*
push = refs/heads/master:refs/heads/qa/master
~~~
這樣,就會讓 git push origin 缺省就把本地的 master 分支推送到遠程的 qa/master 分支上。
## 刪除引用
你也可以使用 refspec 來刪除遠程的引用,是通過運行這樣的命令:
~~~
$ git push origin :topic
~~~
因為` refspec` 的格式是 <src>:<dst>, 通過把` <src>` 部分留空的方式,這個意思是是把遠程的 topic 分支變成空,也就是刪除它。
- 1. 起步
- 1.1 關于版本控制
- 1.2 Git 簡史
- 1.3 Git 基礎
- 1.4 安裝 Git
- 1.5 初次運行 Git 前的配置
- 1.6 獲取幫助
- 1.7 小結
- 2. Git基礎
- 2.1 取得項目的 Git 倉庫
- 2.2 記錄每次更新到倉庫
- 2.3 查看提交歷史
- 2.4 撤消操作
- 2.5 遠程倉庫的使用
- 2.6 打標簽
- 2.7 技巧和竅門
- 2.8 小結
- 3. Git分支
- 3.1 何謂分支
- 3.2 分支的新建與合并
- 3.3 分支的管理
- 3.4 利用分支進行開發的工作流程
- 3.5 遠程分支
- 3.6 分支的衍合
- 3.7 小結
- 4. 服務器上的Git
- 4.1 協議
- 4.2 在服務器上部署 Git
- 4.3 生成 SSH 公鑰
- 4.4 架設服務器
- 4.5 公共訪問
- 4.6 GitWeb
- 4.7 Gitosis
- 4.8 Gitolite
- 4.9 Git 守護進程
- 4.10 Git 托管服務
- 4.11 小結
- 5. 分布式Git
- 5.1 分布式工作流程
- 5.2 為項目作貢獻
- 5.3 項目的管理
- 5.4 小結
- 6. Git工具
- 6.1 修訂版本(Revision)選擇
- 6.2 交互式暫存
- 6.3 儲藏(Stashing)
- 6.4 重寫歷史
- 6.5 使用 Git 調試
- 6.6 子模塊
- 6.7 子樹合并
- 6.8 總結
- 7. 自定義Git
- 7.1 配置 Git
- 7.2 Git屬性
- 7.3 Git掛鉤
- 7.4 Git 強制策略實例
- 7.5 總結
- 8. Git與其他系統
- 8.1 Git 與 Subversion
- 8.2 遷移到 Git
- 8.3 總結
- 9. Git 內部原理
- 9.2 Git 對象
- 9.3 Git References
- 9.4 Packfiles
- 9.5 The Refspec
- 9.6 傳輸協議
- 9.7 維護及數據恢復
- 9.8 總結
- 9.1 底層命令 (Plumbing) 和高層命令 (Porcelain)