2011-09-21 132 views
13

當我在我的gitolite倉庫上創建一個新的倉庫時,我總是必須輸入以下命令才能開始將代碼推送到服務器。git push origin master:refs/heads/master這是什麼

git push origin master:refs/heads/master

它有什麼作用?

我的猜測是與頭部引用無關。有人可以向我解釋嗎?

回答

27

有三個部分下面的命令:

git push 

這將調用push命令

origin 

這名到你按下遙控。這是存儲在.git/config中的一個命名遙控器(可以用git remote列出)​​,URL或代表.這意味着當前存儲庫。

master:refs/heads/master 

這就是所謂的「的Refspec」,你可以在手冊頁讀到它的git push。但總的來說,它由兩部分組成,用冒號分隔。第一部分是本地分支的名稱,第二部分是遠程存儲庫上分支的名稱(在本例中爲origin)。這個特殊的refspec可以縮短爲master:master

通常,人們可以進一步縮短參考文獻。只需指定master作爲refspec就相當於在遙控器上使用相同的名稱,因此mastermaster:master相同。

+0

謝謝你的解釋。我只想添加一個鏈接到Refspec的git文檔: https://git-scm.com/book/en/v2/Git-Internals-The-Refspec 並且還補充說這是一個有用的工具推送一個不同的分支,命名空間,甚至是回購到遠程的分支。我發現這適用於自動化將靜態資產推送到gh頁面的過程,這些過程在與Jekyll編譯後在那裏支持插件。 – prufrofro

1

它爲您設置跟蹤。您可以使用以下簡寫:

git push origin master 

冒號後面的部分是遠程回購分支的名稱。如果你忽略它,git假定你想要相同的名字。

希望這會有所幫助。

2

git push的默認行爲大概是你所描述的「推送代碼到服務器」,只是推送在你推送的遠程地址上按名稱匹配分支的本地分支。當你創建一個新的回購,它沒有分支,所以一個簡單的git push將不會推。您必須先按名稱明確推送分支。此後,默認行爲將按照您的預期工作。

P.S.其實,你只需要git push origin master。它所做的是將你的本地主人作爲主人推送到gitolite倉庫,因爲你沒有指定一個不同的名字。如果你說git push origin master:foo,那麼你在本地調用「master」的分支在gitolite上被稱爲「foo」。

P.P.S.您可以在「無」,「匹配」(默認),「追蹤」/「上游」和「當前」之間切換默認推送行爲。請參閱git-config man page上的「push.default」設置。

4

master:refs/heads/master是一個refspec。

refspecs的形式爲+<src>:<dst>

的所以在這裏主人是你推到refs/heads/master的Refspec上的遠程(來源)在本地回購裁判。 master實際上是refs/heads/master的簡稱。

事實上,你可以只做git push origin master,從而它會推動你的本地主人在遠程主人。只有當你想推到不同的參考你需要明確指定目標參考。

也只是git push也具有默認行爲,這可能不會在您進行第一次推動並在遠程創建分支(主)之前不是這種情況。所以看起來你需要執行你提到的命令。參考手冊

相關問題