2009-10-23 5 views
14

私はgitを使い始めています。私は質問があります。私のアプリには、dev_XXXXXのような独自のブランチを持つ10人の開発者がいます。だから私がリポジトリのクローンを作成すると、そのコードはすべて自分のマシンにコピーされますか?その場合、私はそれを望んでいません。私のブランチがdev_swamyだとしたら、安定したブランチとdev_swamyだけをどのようにクローンするのですか?ありがとう。gitの安定版ともう1つのブランチだけを複製しますか?

答えて

23

は、すべてのブランチを取得しますが、これらの枝は、リモート追跡ブランチとして格納されます例:ブランチのための「dev_XXXXX」「レフリー/リモコン/原点と(「起源/ dev_XXXXX」として格納されます/ dev_XXXXX 'というフルネーム)。これらのリモートトラッキングブランチは、git branch出力には表示されません。リモートトラッキングブランチを一覧表示するにはgit branch -r(すべてのブランチを表示するにはgit branch -a)が必要です。それらのブランチがメインラインから多すぎないと、リポジトリにあまりにも多くのディスクスペースを取らないでしょう。したがって、選択したブランチだけをクローンする理由はわかりません。

あなたは2つだけ選択した支店を持つクローンを持つようにしたい場合はそれにもかかわらず、あなたはこのようにそれを行うことができます。

  1. まず、

    $ mkdir repoclone 
    $ cd repoclone/ 
    $ git init 
    Initialized empty Git repository in /home/user/repoclone/.git/ 
    
  2. 新しい空のリポジトリを作成する次に、あなたのリポジトリを追加'git remote'コマンドを使用して、 'master'と 'dev_swamy'の2つのブランチのトラッキングを要求する、 'origin'という名前で( "git clone"と同じように)正しく追加されたことを確認してください。

    $ 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) 
    

    stableブランチが 'master'ではなく 'stable'と呼ばれる場合は、上記の例を変更する必要があります。指定したブランチをリモートのデフォルトブランチにする場合は、-m <branch>オプションもあります。

  3. 「起源」からのフェッチ(あなたはまた、上記の「Gitはリモート追加」する-fオプションを使用してこれを行うことができます):

    $ 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のクローンは」やるのと同じように、上流として「起源/マスター」)を持っている:あなたはブランチ「dev_swamy」のためにこれを繰り返すことができ

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

  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 
    

リポジトリ(すなわちセット「user.name」と「user.email」設定変数、通常、ユーザーごとの設定ファイル内)での作業を開始する前にGitに自分自身を紹介することを忘れないでください!

4

複製すると、すべてのブランチのすべてのリビジョンが複製されますが、複製されたリポジトリはデフォルトでマスターをチェックアウトします。

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 repoを設定したい場合は、リモートブランチをより細かく見ることができますか?あなたはかなり簡単にそれを行うことができます。

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

Aha!これは私がしばらく考えていたものです。一つのブランチだけをクローンする方法があります。興味深いアイデアは、頭にそれをオンにし、必要なものだけを取る。しかし、最初のフェッチではこのエラーが発生します: "致命的:非ブランチリポジトリの現在のブランチリファレンス/ヘッド/マスターをフェッチすることを拒否しました" –

+0

現代的なgitでBTWに 'git init recoclone'を使用できます。 –

+0

@Steve: 。 "git fetch origin master; git reset --hard FETCH_HEAD'"をマスタに設定することで置き換えることができます。 – u0b34a0f6ae

0

を私はここで、より重要な問題は、他の人はあなたがクローニングたり引っ張っされるものではなく、プッシュされるものだと思います。各開発者は自分のブランチで作業しているので、別の問題は共通のコードベースで終わる方法です。開発者がブランチをマスターに合併していますか?そして、彼らは変更されたマスターブランチを中央のリポジトリにプッシュしていますか?そのような場合は、とにかく他の開発者のブランチを引き出す方法はありません。

そうでない場合、私はあなたが機能するチームをどのように形成することができないのか分かりません。

最終的には、他の開発者のブランチをリポジトリにクローンしたくない理由が分かりました。

0

これを行う別の方法は、直接のクローンを回避する代わりに、手動でfetch refspecのカスタムセットを使用してリモートを手動で追加することです。

デフォルトgit cloneことで

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 
関連する問題