10.5 引用規(guī)格

2018-02-24 15:22 更新

引用規(guī)格

縱觀全書,我們已經(jīng)使用過一些諸如遠(yuǎn)程分支到本地引用的簡單映射方式,但這種映射可以更復(fù)雜。 假設(shè)你添加了這樣一個遠(yuǎn)程版本庫:

$ git remote add origin https://github.com/schacon/simplegit-progit

上述命令會在你的?.git/config?文件中添加一個小節(jié),并在其中指定遠(yuǎn)程版本庫的名稱(origin)、URL 和一個用于獲取操作的引用規(guī)格(refspec):

[remote "origin"]

引用規(guī)格的格式由一個可選的?+?號和緊隨其后的?<src>:<dst>?組成,其中?<src>?是一個模式(pattern),代表遠(yuǎn)程版本庫中的引用;<dst>?是那些遠(yuǎn)程引用在本地所對應(yīng)的位置。?+?號告訴 Git 即使在不能快進(jìn)的情況下也要(強制)更新引用。

默認(rèn)情況下,引用規(guī)格由?git remote add?命令自動生成, Git 獲取服務(wù)器中?refs/heads/下面的所有引用,并將它寫入到本地的?refs/remotes/origin/?中。 所以,如果服務(wù)器上有一個?master?分支,我們可以在本地通過下面這種方式來訪問該分支上的提交記錄:

$ git log origin/master
$ git log remotes/origin/master
$ git log refs/remotes/origin/master

上面的三個命令作用相同,因為 Git 會把它們都擴展成?refs/remotes/origin/master。

如果想讓 Git 每次只拉取遠(yuǎn)程的?master?分支,而不是所有分支,可以把(引用規(guī)格的)獲取那一行修改為:

fetch = +refs/heads/master:refs/remotes/origin/master

這僅是針對該遠(yuǎn)程版本庫的?git fetch?操作的默認(rèn)引用規(guī)格。 如果有某些只希望被執(zhí)行一次的操作,我們也可以在命令行指定引用規(guī)格。 若要將遠(yuǎn)程的?master?分支拉到本地的origin/mymaster?分支,可以運行:

$ git fetch origin master:refs/remotes/origin/mymaster

你也可以指定多個引用規(guī)格。 在命令行中,你可以按照如下的方式拉取多個分支:

$ 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?分支的拉取操作被拒絕,因為它不是一個可以快進(jìn)的引用。 我們可以通過在引用規(guī)格之前指定?+?號來覆蓋該規(guī)則。

你也可以在配置文件中指定多個用于獲取操作的引用規(guī)格。 如果想在每次獲取時都包括?master?和experiment?分支,添加如下兩行:

[remote "origin"]

我們不能在模式中使用部分通配符,所以像下面這樣的引用規(guī)格是不合法的:

fetch = +refs/heads/qa*:refs/remotes/origin/qa*

但我們可以使用命名空間(或目錄)來達(dá)到類似目的。 假設(shè)你有一個 QA 團(tuán)隊,他們推送了一系列分支,同時你只想要獲取?master?和 QA 團(tuán)隊的所有分支而不關(guān)心其他任何分支,那么可以使用如下配置:

[remote "origin"]

如果項目的工作流很復(fù)雜,有 QA 團(tuán)隊推送分支、開發(fā)人員推送分支、集成團(tuán)隊推送并且在遠(yuǎn)程分支上展開協(xié)作,你就可以像這樣(在本地)為這些分支創(chuàng)建各自的命名空間,非常方便。

引用規(guī)格推送

像上面這樣從遠(yuǎn)程版本庫獲取已在命名空間中的引用當(dāng)然很棒,但 QA 團(tuán)隊最初應(yīng)該如何將他們的分支放入遠(yuǎn)程的?qa/?命名空間呢? 我們可以通過引用規(guī)格推送來完成這個任務(wù)。

如果 QA 團(tuán)隊想把他們的?master?分支推送到遠(yuǎn)程服務(wù)器的?qa/master?分支上,可以運行:

$ git push origin master:refs/heads/qa/master

如果他們希望 Git 每次運行?git push origin?時都像上面這樣推送,可以在他們的配置文件中添加一條?push?值:

[remote "origin"]

正如剛才所指出的,這會讓?git push origin?默認(rèn)把本地?master?分支推送到遠(yuǎn)程qa/master?分支。

刪除引用

你還可以借助類似下面的命令通過引用規(guī)格從遠(yuǎn)程服務(wù)器上刪除引用:

$ git push origin :topic

因為引用規(guī)格(的格式)是?<src>:<dst>,所以上述命令把?<src>?留空,意味著把遠(yuǎn)程版本庫的?topic?分支定義為空值,也就是刪除它。

以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號