我刚刚开始使用 git,我有一个问题。我的应用程序有 10 位其他开发人员在开发,每个开发人员都有自己的分支,例如 dev_XXXXX。所以如果我克隆存储库,他们的所有代码都会复制到我的机器上吗?在那种情况下,我不想要那个。假设我的分支是 dev_swamy,那么我该如何克隆稳定分支和 dev_swamy?谢谢。
4 回答
默认情况下git clone
会获取所有分支,但这些分支将存储为远程跟踪分支:例如,分支“dev_XXXXX”将存储为“origin/dev_XXXXX”(全名为“refs/remotes/origin/dev_XXXXX”)。这些远程跟踪分支在输出中不可见git branch
:您需要git branch -r
列出远程跟踪分支(或git branch -a
列出所有分支)。如果这些分支与主线没有太大分歧,它们就不会在存储库中占用太多磁盘空间。因此,我不明白您为什么只想克隆选定的分支。
然而,如果你想要一个只有两个选定分支的克隆,你可以这样做:
首先,创建新的空存储库
$ mkdir repoclone $ cd repoclone/ $ git init Initialized empty Git repository in /home/user/repoclone/.git/
然后将您的存储库添加到名称“origin”下(就像“git clone”一样),请求仅跟踪两个分支:“master”和“dev_swamy”,使用“ git remote ”命令。检查它是否被正确添加。
$ 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' 获取(你也可以通过使用
-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
设置本地分支“master”(您将在其中工作)以遵循“origin/master”(将“origin/master”作为上游),就像“git clone”一样:
$ git checkout -t origin/master Branch master set up to track remote branch master from origin. Already on 'master'
您可以对分支“dev_swamy”重复此操作。
现在您可以看到配置文件的样子。 您可以通过将文件编辑为如下所示,然后执行 "git fetch"来获得完全相同的结果
.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' 配置变量;通常在每个用户的配置文件中)!
如果你克隆,所有分支中的所有修订都会被克隆,但克隆的存储库默认会检出 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
我认为这里更重要的问题是其他人将推动什么,而不是你将克隆或拉动什么。由于每个开发人员都在自己的分支上工作,另一个问题是如何最终获得一个通用代码库。开发人员是否正在合并他们的分支以掌握?然后他们是否将更改后的主分支推送到中央存储库?如果是这样的话,你无论如何也没有办法拉其他开发人员的分支。
如果不是这样,我看不出你如何才能组建一个运作良好的团队。
正如我最后的想法:我很想知道为什么您不想将其他开发人员的分支克隆到您的存储库?
另一种方法是避免直接克隆,而是手动添加一个带有自定义 fetch 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