2009-10-23 123 views
14

我剛開始使用git,我有一個問題。我的應用程序有10個其他開發人員在工作,每個人都有自己的分支,如dev_XXXXX。因此,如果我對存儲庫進行克隆,那麼是否將他們的所有代碼複製到我的機器上?在那種情況下,我不想要那個。假設我的分支是dev_swamy,那麼我如何克隆穩定分支和dev_swamy?謝謝。克隆git中的stable和其他分支?

回答

23

默認git clone將取所有分支,但這些分支將被存儲的遠程跟蹤分支:例如分支「dev_XXXXX」將被存儲爲「原點/ dev_XXXXX」(與「參/遙控器/原點/ dev_XXXXX'作爲全名)。這些遠程跟蹤分支在git branch輸出中不可見:您需要git branch -r列出遠程跟蹤分支(或git branch -a列出所有分支)。如果這些分支與主線不會有太大分歧,那麼它們不會在存儲庫中佔用太多的磁盤空間。因此我不明白你爲什麼只想克隆選定的分支。

不過,如果你想與只有兩個選擇分支的克隆,你可以做這樣的:

  1. 首先,創建一個新的空庫

    $ mkdir repoclone 
    $ cd repoclone/ 
    $ git init 
    Initialized empty Git repository in /home/user/repoclone/.git/ 
    
  2. 添加您的倉庫在'origin'這個名字下(就像「git clone」會命名它),使用「git remote」命令請求只跟蹤兩個分支:'master'和'dev_swamy'。檢查它是否正確添加。

    $ git remote add -t master -t dev_swamy origin [email protected]:repo.git 
    $ git remote 
    origin 
    $ git remote show origin 
    * remote origin 
        Fetch URL: [email protected]:repo.git 
        Push URL: [email protected]:repo.git 
        HEAD branch: master 
        Remote branches: 
        master   new (next fetch will store in remotes/origin) 
        dev_swamy new (next fetch will store in remotes/origin) 
    

    如果穩定分支被稱爲'穩定'而不是'主',你當然會修改上面的例子。如果您希望指定的分支是遠程默認分支,則還有-m <branch>選項。

  3. 從「出身」取(你可以做到這一點還可以通過使用-f選項「git的遠程添加」以上):

    $ git fetch 
    remote: Counting objects: 282, done. 
    remote: Compressing objects: 100% (193/193), done. 
    remote: Total 282 (delta 82), reused 0 (delta 0) 
    Receiving objects: 100% (282/282), 81.30 KiB | 135 KiB/s, done. 
    Resolving deltas: 100% (82/82), done. 
    From [email protected]:repo.git 
    * [new branch]  master  -> origin/master 
    * [new branch]  dev_swamy -> origin/dev_swamy 
    From [email protected]:repo.git 
    * [new tag]   v1.0  -> v1.0 
    * [new tag]   v1.0.1 -> v1.0.1 
    * [new tag]   v1.1  -> v1.1 
    
  4. 設置本地分支「大師」(你會做你的工作)遵循「原點/主」(有「原點/主」上游),就像「混帳克隆」會做:

    $ git checkout -t origin/master 
    Branch master set up to track remote branch master from origin. 
    Already on 'master' 
    

    可以重複此分支「dev_swamy」。

  5. 現在您可以看到配置文件的外觀。 通過編輯.git/config文件,您可以得到完全相同的結果,如下所示,然後執行「git fetch」

    $ cat .git/config # or just open this file in your editor 
    [core] 
         repositoryformatversion = 0 
         filemode = true 
         bare = false 
         logallrefupdates = true 
    [remote "origin"] 
         url = [email protected]:repo.git 
         fetch = +refs/heads/master:refs/remotes/origin/master 
         fetch = +refs/heads/dev_swamy:refs/remotes/origin/dev_swamy 
    [branch "master"] 
         remote = origin 
         merge = refs/heads/master 
    

不要忘了介紹自己開始對倉庫工作前到Git(即集「user.name」和「user.email」配置變量,通常在每個用戶的配置文件)!

4

如果您克隆,則所有分支中的所有修訂都會被克隆,但克隆的存儲庫默認會檢出master。

只是採取選定的分支是棘手的,因爲git並不真的認爲你應該這樣工作。您必須手動拉下分支:

mkdir repoclone 
cd repoclone 
git init 
git remote add origin git://remote/url 
git fetch origin master:master 
git fetch origin dev_XXX:dev_XXX 

以上是我所瞭解的工作。但是,如果你想建立一個像平常一樣工作的git倉庫,只是對它的遠程分支有更窄的視圖?你可以做到這一點很容易地:

mkdir repoclone 
cd repoclone 
git init 
git remote add origin git://remote/url 

# now open .git/config for editing in your editor 
# replace the following line (grab all remote branches) 
fetch = +refs/heads/*:refs/remotes/origin/* 

# replace with lines listing exactly which branches you want 
fetch = +refs/heads/master:refs/remotes/origin/master 
fetch = +refs/heads/dev_XXX:refs/remotes/origin/dev_XXX 

# save the file, now run 

git fetch 
+0

啊哈!這是我一直在考慮的問題 - 是否有辦法克隆只有一個分支。一個有趣的想法是打開它的頭並只抓取你需要的東西。但是第一次獲取會產生這樣的錯誤:「致命的:拒絕進入非裸倉庫的當前分支裁判/頭/主」 – 2009-10-23 20:50:13

+0

順便說一句,你可以使用'git init repoclone' – 2009-10-23 22:07:43

+0

@Steve:啊,你是對的。您可以用「'git fetch origin master; git reset --hard FETCH_HEAD'」替換爲設置主文件。 – u0b34a0f6ae 2009-10-23 22:50:11

0

我覺得這裏更重要的問題是什麼人將力推,而不是你會被克隆或拉。由於每個開發人員都在自己的分支上工作,另一個問題是如何最終得到一個通用的代碼庫。開發者是否將他們的分支合併爲主?然後他們是否將他們改變的主分支推送到中央存儲庫?如果是這樣的話,無論如何你都無法拉動其他開發商的分支機構。

如果情況並非如此,我不會看到你如何才能組成一個有效的團隊。

正如我最後的想法:我很想知道爲什麼你不想克隆其他開發者的分支到你的倉庫?

0

另一種方法是避免直接克隆,而是手動添加一個具有自定義提取refspecs的遠程設備。

例如

mkdir myclone 
cd myclone 
git init 

git remote add origin url://origin.repo 

# Add fetch rules for the branches that we want to track 
git config remote.origin.fetch +refs/heads/master:+refs/remotes/origin/master 
git config --add remote.origin.fetch +refs/heads/dev_swamy:+refs/remotes/origin/dev_swamy 

# fetch now fetches just what we need, subsequently it will do incremental fetches 
git fetch 

# Creating local branches tracking the remote branches 
git checkout -b master origin/master 
git branch dev_swamy origin/dev/swamy