协慌网

登录 贡献 社区

如何在 Git 中克隆单个分支?

我有一个本地的名为 “skeleton” 的 Git 存储库,用于存储项目框架。它有几个分支,分别用于不同类型的项目:

casey@agave [~/Projects/skeleton] git branch
* master
  rails
  c
  c++

如果我想签出新项目的 master 分支,我可以做

casey@agave [~/Projects] git clone skeleton new
Initialized empty Git repository in /Users/casey/Projects/new/.git/

一切都是我想要的。具体来说,新的 master 分支指向骨架 master 分支,我可以推动和拉动以移动对基本项目设置的更改。

但是,如果我要克隆另一个分支,那是行不通的。我无法理解它,所以我只拉了我想要的分支,例如rails分支,然后默认情况下,新存储库有一个master分支,该master分支可推入和拉出骨架存储库的rails分支。

有一个好的方法去做吗?或者,也许这不是 Git 想要我构造事物的方式,我当然对此持开放态度。也许我应该有多个存储库,而 Ruby on Rails 框架存储库跟踪主框架存储库?以及任何克隆 Ruby on Rails 骨架存储库的项目。

答案

注意: git1.7.10 (2012 年 4 月)实际上允许您克隆一个分支

# clone only the remote primary HEAD (default: origin/master)
git clone --single-branch

as in:
git clone <url> --branch <branch> --single-branch [<folder>]

您可以在t5500-fetch-pack.sh看到它:

test_expect_success 'single branch clone' '
  git clone --single-branch "file://$(pwd)/." singlebranch
'

东武 评论

进行浅层克隆时,这是隐式的。
这使git clone --depth 1成为节省带宽的最简单方法。

自 Git 1.9.0(2014 年 2 月)以来,浅层克隆支持数据传输(推 / 拉),因此该选项现在更加有用。
请参阅 “ git clone --depth 1 (浅克隆)是否比它有用吗? ” 中的更多内容。


将浅层克隆转换为完整克隆 ” 中详细介绍了 “撤消” 浅层克隆(git 1.8.3+)

# unshallow the current branch
git fetch --unshallow

# for getting back all the branches (see Peter Cordes' comment)
git config remote.origin.fetch refs/heads/*:refs/remotes/origin/*
git fetch --unshallow

克里斯评论道:

使缺少的分支反转的神奇方法是--single-branch (git v2.1.4):

git config remote.origin.fetch +refs/heads/*:refs/remotes/origin/*
git fetch --unshallow

一种方法是执行以下操作。

git clone user@git-server:project_name.git -b branch_name /your/folder

其中branch_name是您选择的分支,而 “/ your / folder” 是该分支的目标文件夹。的确,这将带来其他分支,从而为您提供来回合并的机会。

更新资料

现在,从 Git 1.7.10 开始,您现在可以执行此操作

git clone user@git-server:project_name.git -b branch_name --single-branch /your/folder

使用 Git 版本 1.7.3.1(在 Windows 上),这是我的工作( $BRANCH是我要检出的分支的名称, $REMOTE_REPO是我要从其克隆的远程存储库的 URL):

mkdir $BRANCH
cd $BRANCH
git init
git remote add -t $BRANCH -f origin $REMOTE_REPO
git checkout $BRANCH

这种方法的优势在于,随后的git pull (或git fetch )调用也将只下载所请求的分支。