(注意 - 我的git版本是1.8.3。)
说我结帐一个示例项目的分支主人。
git clone --branch master "//server/GitProject.git" "C:/Project"
克隆了存储库。但是......究竟克隆了什么?对我而言,似乎所有东西都被克隆了。整个项目树,所有分支机构。 “ - branch master”只创建本地分支“master”,设置跟踪到origin / master并使HEAD指向master。
但是有50个不同的分支,每个分支有数百甚至数千个提交。我不知道(我也不在乎)大多数这些分支是什么,其中一些代表不同的和过时的旧版本,一些是由不同的团队,不同的团队成员创建的。当然,这也可能意味着我们公司的项目&分支管理失控了,但我们假设我们无法做任何事情。
现在,结帐后,git branch -a
的输出会输出类似的结果。
*master
remotes/origin/Branch1
remotes/origin/Branch2
remotes/origin/Branch3
remotes/origin/Branch4
...etc
最近的主数据有371 MB ......但.git
目录有2 GB。
现在让我们假设我是公司中唯一一个承诺掌握的人。我不需要整个项目树。我将尝试删除所有其他分支以仅保留相关数据。
如果我删除了所有远程分支,我不需要像这样......(unfortunately, I haven't found a command for it)
git branch -rd origin/Branch1
git branch -rd origin/Branch2
git branch -rd origin/Branch3
git branch -rd origin/Branch4
...
git gc --prune=now
... .git文件夹的大小从2 GB减少到477 MB。这表明git checkout
确实下载了整个提交树,而不仅仅是指向我想要的分支的部分。
现在一切正常。当我指定它时,拉和推命令仅适用于master。
第一个问题:使用git,“仅相关数据”工作流程是否合理?如果没有,为什么?
如果对第一个问题的答案是肯定的,那么我就有第二个问题。
有时,我需要使用可能位于提交树中任何位置的不同分支。但我还没弄清楚如何正确地做到这一点。
如果我致电git remote show origin
,我会得到类似的内容
* remote origin
Fetch URL: //server/GitProject.git
Push URL: C:\Project
HEAD branch: master
Remote branches:
Branch1 new (next fetch will store in remotes/origin)
Branch2 new (next fetch will store in remotes/origin)
Branch3 new (next fetch will store in remotes/origin)
etc...
我看到git可以访问分支,其提交,引用和跟踪分支我本地没有。
但这句话“下一次获取将存储在遥控器/原点”让我感到困惑。我知道如果我git fetch
我在本地创建了我的远程分支Branch1 - 但与其他所有内容一起,使用项目的整个提交树。 .git文件夹的大小将再次增加到2 GB。我不想那样做。我想要的那个分支可能只包含几个来自最近大师的提交。
第二个问题:如果我没有对远程分支的本地引用,并且只下载提交树的相关部分,那么如何仅下载特定分支?
我试过了......
git fetch origin Branch1
......这似乎完全符合我的要求。但是当我git branch -a
时,这就是输出。没有Branch1。
* master
remotes/origin/HEAD -> origin/master
remotes/origin/master
我想这意味着Branch1的提交被下载并附加到树上(或者可能根本没有附加?)但由于没有与远程分支匹配的本地引用,因此无法访问它。所以我必须以某种方式创建本地引用。我认为。但我不确定如何。