18

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

4

4 に答える 4

27

デフォルトでgit cloneはすべてのブランチをフェッチしますが、これらのブランチはリモートトラッキングブランチとして保存されます。たとえば、ブランチ'dev_XXXXX'は'origin / dev_XXXXX'として保存されます(フルネームは'refs / remotes / origin / 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. 次に、リポジトリを「origin」という名前で追加し(「gitclone」が名前を付けるのと同じように)、「 git remote」コマンドを使用して、「master」と「dev_swamy」の2つのブランチのみの追跡を要求します。正しく追加されたことを確認してください。

    $ git remote add -t master -t dev_swamy origin user@example.com:repo.git
    $ git remote 
    origin
    $ git remote show origin
    * remote origin
      Fetch URL: user@example.com:repo.git
      Push  URL: user@example.com: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. 'origin'からフェッチします(-f上記の "git remote add"のオプションを使用してこれを行うこともできます):

    $ 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 user@example.com:repo.git
     * [new branch]      master     -> origin/master
     * [new branch]      dev_swamy -> origin/dev_swamy
    From user@example.com:repo.git
     * [new tag]         v1.0       -> v1.0
     * [new tag]         v1.0.1    -> v1.0.1
     * [new tag]         v1.1       -> v1.1
    
  4. 「gitclone」と同じように、ローカルブランチ「master」(作業を行う場所)を「origin / master」(「origin / master」をアップストリームとして持つ)に従うように設定します。

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

    ブランチ'dev_swamy'に対してこれを繰り返すことができます。

  5. これで、構成ファイルがどのように見えるかを確認できます。 次のようにファイルを編集してから「gitfetch」を実行すると、まったく同じ結果を得ることができます.git/config

    $ cat .git/config  # or just open this file in your editor
    [core]
            repositoryformatversion = 0
            filemode = true
            bare = false
            logallrefupdates = true
    [remote "origin"]
            url = user@example.com: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」構成変数を設定します。通常はユーザーごとの構成ファイルにあります)。

于 2009-10-23T23:01:23.853 に答える
5

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

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
于 2009-10-23T20:04:58.547 に答える
0

ここでより重要な質問は、クローンやプルではなく、他の人が何をプッシュするかということだと思います。各開発者は独自のブランチに取り組んでいるため、別の質問は、どのようにして共通のコードベースを作成するかということです。開発者はブランチをマスターにマージしていますか?そして、変更されたマスターブランチを中央リポジトリにプッシュしていますか?その場合、とにかく他の開発者のブランチをプルする方法はありません。

そうでない場合は、機能するチームを形成する方法がわかりません。

そして、私が最終的に考えたように、他の開発者のブランチをリポジトリに複製したくない理由を知りたいと思いますか?

于 2009-10-23T20:23:02.770 に答える
0

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

例えば

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
于 2009-10-23T22:26:39.137 に答える