2015-02-17 67 views
0

在本地Git倉庫此文件夾包含頭文件只是克隆後:什麼時候在Git中創建本地遠程跟蹤分支?

.git\refs\remotes\origin\ 

當我創建一個遠程跟蹤分支的本地分支,分支將在創建:

.git\refs\heads 

.git\refs\remotes\origin\ 

當我推在當地分支修改到遠程存儲庫中創建分支的新副本那麼當它們最初被推送到遠程存儲庫時,首先在上述文件夾中創建遠程跟蹤分支?

+0

*那麼,遠程跟蹤分支在上面的文件夾時,第一次創建他們最初被推送到遠程存儲庫?*請澄清你的問題。 – Jubobs 2015-02-17 23:21:15

回答

2

你不應該關心其中分支機構存儲(如你應該使用「通告」的接口,git branchgit for-each-ref,等等)。 問題雖然更有趣。

遠程追蹤分支只是refs/remotes名稱空間中的參考。通常情況下,還會增加一個級別,特別是遠程本身的名稱,因此對於名爲origin的遠程,分支將全部落入refs/remotes/origin

git clone命令會在您本地的git配置文件(針對該存儲庫)中創建一個remote配置條目。此配置條目,假設你告訴git clone使用默認origin名稱的部分內容:

[remote "origin"] 
    fetch = +refs/heads/*:refs/remotes/origin/* 

這就是名字空間來自:在remote.origin配置條目的fetch線(S),即從東西:

$ git config --get-all remote.origin.fetch 

實際的遠程跟蹤分支創作發生在幾個地方。

最明顯的是當fetch(或初始clone步驟,其中包括fetch的輕微變化)或git remote update運行。這些命令詢問遠程有關它的參考。那些匹配一條或多條fetch線路的線路將被複制,已修改基於每個參考線路的右側。

這意味着,在git clonegit fetch origin,或git remote origin update,如果遠程擁有refs/heads/foo(分支foo),你自己的本地存儲庫獲取對應的refs/remotes/origin/foo。如果您之前沒有,則會創建一個(本地)遠程跟蹤分支。

(如果您運行git fetch這樣你阻止它取分支foo,雖然,跟蹤分支不獲得創建。例如,如果你運行git fetch origin refs/heads/bar:refs/temp_bar,這個取帶來了只有refs/heads/bar。不同版本的Git將會或不會在此時創建或更新refs/remotes/origin/bar:1.8.4版本不會,但更新的版本將會採用正常的fetch配置。)

git push期間發生不太明顯的情況。在這種情況下,當您的本地git成功提供對遠程名稱空間的引用時,本地git還將使用與git fetch相同的refspec映射創建或更新遠程跟蹤分支。 因此,使用默認設置,推refs/heads/new使得它上創建遠程origin分支foo創建(本地)遠程跟蹤分支refs/remotes/origin/new(我把這個大膽的,因爲我認爲它的答案,我認爲你問這個問題。)

如果添加--prunegit fetchgit remote update命令時,它也將刪除遠程 - 如果他們現在在遙控器上失蹤 - 他們可以告訴他們,因爲他們從遙控器獲得所有引用。 (請記住,這是從git push--prune選項,這意味着在遙控器上刪除分支非常不同的,一拉git push --deletegit push :dst。)

相關問題