質問
gitを使い始めたばかりで、質問があります。私のアプリには10人の開発者が取り組んでおり、各開発者はdev_XXXXXのような独自のブランチを持っています。リポジトリのクローンを作成する場合、すべてのコードがマシンにコピーされますか?その場合、私はそれを望んでいません。私のブランチがdev_swamyであると仮定すると、どうすれば安定したブランチとdev_swamyだけをクローンできますか?ありがとう。
解決
デフォルトではgit clone
はすべてのブランチをフェッチしますが、これらのブランチはリモートトラッキングブランチとして保存されます。たとえば、ブランチ「dev_XXXXX」は「origin / dev_XXXXX」として保存されます(「refs / remotes / origin / dev_XXXXX 'フルネームとして)。これらのリモートトラッキングブランチは、git branch
出力には表示されません。リモートトラッキングブランチをリストするにはgit branch -r
(またはすべてのブランチをリストするにはgit branch -a
)が必要です。これらのブランチがメインラインからあまり分岐していない場合、リポジトリ内のディスク領域をあまり取りません。したがって、選択したブランチのみを複製する理由がわかりません。
それでも、選択したブランチが2つしかないクローンを作成したい場合は、次のようにします。
-
最初に、新しい空のリポジトリを作成
$ mkdir repoclone $ cd repoclone/ $ git init Initialized empty Git repository in /home/user/repoclone/.git/
-
次に、「origin」という名前でリポジトリを追加し(<!> quot; git clone <!> quot;という名前になります)、「master」と「dev_swamy」の2つのブランチのみの追跡を要求します、<!> quot; git remote <!> quot;コマンド。正しく追加されたことを確認してください。
$ 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>
オプションがあります。 -
「origin」から取得(<!> quot; git remote add <!> quot;上記の
-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 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
-
<!> quot; git clone <のように、ローカルブランチ 'master'(作業を行う場所)を 'origin / master'(上流として 'origin / master'を持つ)に設定します< !> quot;します:
$ git checkout -t origin/master Branch master set up to track remote branch master from origin. Already on 'master'
ブランチ 'dev_swamy'に対してこれを繰り返すことができます。
-
これで、構成ファイルがどのように見えるかを確認できます。
.git/config
ファイルを次のように編集し、<!> quot; git fetch <!> quot; を実行することで、まったく同じ結果を得ることができます。$ 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」構成変数を設定します。通常はユーザーごとの構成ファイルで)
他のヒント
クローンを作成すると、すべてのブランチのすべてのリビジョンがクローンされますが、クローンされたリポジトリはデフォルトでマスターをチェックアウトします。
選択したブランチを取得するのは、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
これを行う別の方法は、直接クローンを回避することですが、代わりにフェッチrefspecsのカスタムセットでリモートを手動で追加します。
e.g。
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
ここでより重要な質問は、他の人が何をプッシュするかであり、あなたがクローンやプルするものではないことだと思います。各開発者は自分のブランチで作業しているため、別の質問は、どのようにして共通のコードベースを作成するかです。開発者は、ブランチをマスターにマージしていますか?そして、変更されたmasterブランチを中央リポジトリにプッシュしますか?その場合は、とにかく他の開発者のブランチをプルする方法はありません。
そうでない場合、機能するチームをどのように形成できるかわかりません。
そして最後に考えたように、他の開発者のブランチをリポジトリにクローンしたくない理由を知りたいですか?