2017-06-13 117 views
1

我有一個服務器包含一個Git倉庫與幾個分支。 我查了與 「混帳分支-r」 服務器Git和它顯示:
出身/ HEAD
產地/開發
產地/ neatUI
產地/ iOS的
......以及一些更如何克隆所有分支的git存儲庫?

如果我克隆這個存儲庫: 「git clone [path_to_server]/ATS ATS」 我收到一個只包含「develop」的存儲庫。 「混帳分支-a」 顯示:
*開發
遙控器/產地/ HEAD - >原產地/開發
遙控器/原產地/開發

所有其他分支丟失。

如果我使用--mirror選項克隆存儲庫,所有分支都存在,但我無法使用它們。 「混帳分支-a」 顯示:
遙控器/產地/ HEAD
遙控器/原產地/開發
遙控器/產地/ neatUI
遙控器/產地/ iOS的
......其餘

如果我嘗試結帳分支git告訴我「致命的:這個操作必須在工作樹上運行」

我也試過「SourceTree」來複制repoistory,但SourceTree也只創建了「develop」分支。

任何人有想法?

+0

鏡像克隆是克隆裸露,你不能在它檢查的分支。 –

+0

您有一個服務器存儲庫。你在該回購中運行'git branch -r'。運行'git branch -r'不會列出該回購中的分支。它列出了遠程分支。 IE瀏覽器。 '''''''iOS'和'neatUI'都是您的服務器存儲庫克隆的其他倉庫中的所有分支。要列出服務器倉庫中的分支,你應該運行'git branch'而不用'-r'標誌。 – Alderath

+0

git分支只顯示「開發」。看起來你在正確的軌道上! :) 如何添加其他分支? –

回答

0

Alderath在他上面的評論中給出了重要提示。
再次感謝您!

2

如果您使用git clone <url>進行克隆,請放心,所有分支都在您的工作樹中。你只需要剝離原產地/當你想簽入其他分支。例如,如果要檢出的iOS,做git checkout iOS

git branch -r顯示了庫中的所有遠程分支機構

git branch -a遠程顯示以及地方分支機構(如果你創建的任何在您的本地回購)

+0

如果我只是克隆回購(沒有 - 鏡像),沒有iOS分支。 「git checkout iOS」產生「error:pathspec」iOS與git.r已知的任何文件不匹配)「 –

+0

你如何切換你的分支? –

+0

我如何確保所有分支都在那裏?正如我之前告訴「git branch -a」只顯示「開發」... –

1

這裏有幾個獨立但交織在一起的關鍵概念。

首先是,雖然Git有分支名稱,那是不是所有的Git有(爲此事,術語分支是模糊的:又見What exactly do we mean by "branch"?)。 Git也有標籤以及Git所稱的遠程跟蹤分支名稱,這些都屬於一個通用類別,稱爲,參考文獻

  • master一個分支的名字僅僅是一個參考,其名與refs/heads/開始。

  • origin/iOS等的遠程跟蹤分支名是參考其名與refs/remotes/開始,接着由遠程本身(origin)和另一斜槓的名稱。該最後部分,iOS,是你的Git通常副本從另一個Git

    (這樣做的遠程部分是一個幾乎任意字符串。你可以發明自己的遠程名稱。但是,遙控器的名稱獲取以後添加的斜線是依賴於你應該是理由的事實小心在遠程名稱中使用斜線。)

  • 要完成這個特殊的名單,像v1.0標籤名稱是一個簡單的引用,其名與refs/tags/開始。還有更多的引用形式(refs/notes/用於Git的git notes,而GitHub用例子爲refs/pull/),但分支,標籤和遠程跟蹤分支都內置,標準的,最重要的是,高度可見 - 所以你應該知道關於他們。

當您運行git branch,Git會找到你所有的refs/heads/參考名稱,並顯示它們與refs/heads/剝離。當您運行git branch -r時,Git會查找您所有的refs/remotes/引用,並將它們與refs/remotes/一起剝離。當你運行git branch -a時,Git發現了這兩個,並且顯示第一個被剝離的refs/heads/,但是顯示第二個被剝離了refs/。 (?!爲什麼誰知道這是Git的是gitty :-))。

這就解釋了爲什麼你看到你所看到的,但不能與git clone --mirror會發生什麼,也不知道爲什麼你可以git checkout iOS,突然有一個新的refs/heads/iOS;並且爲此我們需要兩個以上的項目,大約refspecs(與git fetchgit push一起使用)和約what Git calls DWIM, or Do What I Mean, in git checkout

爲了保持這個簡短:a 參考只是一對引用,用冒號分隔,有時用*替換一部分。例如,refs/heads/*:refs/remotes/origin/*是一個refspec。你也可以在前面加一個前導加號的前綴refspec;這將設置--force標誌。 git fetchgit push與refspecs一起工作(並且都有--force他們自己的標誌,它有效地將+添加到您在命令行上給出的任何refspecs)。冒號前的參考是和參考冒號後是目的地,這很重要,因爲有2個控釋片參與git fetchgit push:你的,和其他一些Git的。

當你git fetch,源引用其他Git的引用和目標的人是你。當你git push,來源參考是你的,而目的地是他們的。

使用git clone --mirror告訴你的Git建立一個庫(我將離開這裏未定義),並設立+refs/*:refs/*爲的Refspec爲git fetch。這複製所有參考從其他Git在origin,但它意味着你不能擁有自己的分支機構:你的Git現在是他們的一個確切的副本,並且每次運行git fetch時,您的取代您所擁有的一切。他們的確切副本,再次。

大多數git clone操作的要點是得到一個不精確「他們的Git」的副本。這裏的基本想法是,你希望所有的他們分支名稱成爲遠程跟蹤分支名稱。他們的master成爲您的origin/master;他們的iOS成爲您的origin/iOS

這沒有留下餘地他們origin/*,因爲你的不精確的副本具有自己的origin/*。如果你想獲得他們的遠程追蹤分支,你可以 - 但你需要給他們一些其他的名字!

一旦你有你的(無反光鏡)克隆,和他們whatever成爲你origin/whatever,可以git checkout whatever和DWIM動作我提到(和鏈接)以上進場時,創建新的本地whatever使用自己的origin/whatever哪位你從他們的whatever複製!