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


799

我有一个本地的名为“ 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分支,该分支可推入和拉出骨架存储库的rails分支。

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


是什么git branch -a节目?
JakubNarębski09年

3
git checkout -b newbranch origin/branchiwant更好吗?(没有--track选择权)
VonC

3
我认为您要尝试执行的操作是一个坏主意。对不同的项目使用不同的存储库。分支完全不同。
innaM,2009年

@Manni,我有点想,因为git似乎不喜欢我在做什么。你能解释为什么吗?是因为分支不应该长期存在吗?
Casey Rodarmor 09年

1
@rodarmor我认为您想要做的是一个好主意,而我恰好有这个问题。
Paul Du Bois

Answers:


863

注意: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 2.26(Q1 2020),“ git clone --recurse-submodules --single-branch克隆子模块时现在使用相同的单分支选项

参见Emily Shaffer(提交132f600提交4731957(2020年2月21日(通过合并JUNIOÇ滨野- -提交b22db26,2020年3月5日)nasamuffin
gitster

clone:在--recurse-submodules期间传递--single-branch

签字人:艾米莉·谢弗
签名人:杰夫·金

以前,git clone --recurse-submodules --single-branch即使超级项目仅克隆了一个分支,执行“ ”仍会导致子模块克隆所有分支。

管道--single-branch通过子模块的辅助框架,使其向“ clone”以后。


80
git clone <url> --branch <branch> --single-branch <folder>奇迹般有效。
2012年

1
是的,我认为是时候更新接受的答案了:)这的确“像魅力一样工作”
kumarharsh

5
同样,在进行浅层克隆时这是隐式的。这是clone --depth 1节省带宽的最简单方法。
东武

1
@Tobu和VonC --depth 1对用户而言是不安全的,因为他们可能希望实际推/拉新克隆。
nmr 2014年

2
只是为了完整说明Peter Cordes的更正,使缺少的分支反转的魔术线--single-branchgit config remote.origin.fetch +refs/heads/*:refs/remotes/origin/*and git fetch --unshallow(git v2.1.4)
克里斯

670

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

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

36
这可行,但是会获取所有分支。请参阅下面的@ frerich = raabe的答案。
cdunn2001

3
谢谢。在我的情况下只添加“ -b branch_name”。它节省了我很多时间。
PhatHV

是的,它运作完美...!我更喜欢TFS,对于我的个人项目,我一直在使用git。Wrto git branching,我之前做错了方法,很高兴知道这种简单的方法,而且看起来很完美!再次感谢!已经+1,如果可能的话,我会给+100 :)
k25 2013年

11
您还可以添加--single-branch仅获取与此分支关联的历史记录,而不是添加存储库包含的所有历史记录和标签。
瑕疵的2014年

1
@AlexNolasco您能编辑答案是/ some / folder吗?谢谢
Nabin

112

使用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)调用也将仅下载所请求的分支。


您的脚本和此行之间有什么区别?git clone -b $BRANCH $REMOTE_REPO $BRANCH阿菲克他们是一样的吗?
伊恩·沃恩

12
@Ian:区别在于,git clone -b为您提供了所有的远程引用(所有远程分支和标签),如图git branch -a所示。使用我的脚本,您只会得到一个参考。
Frerich Raabe 2011年

1
当我尝试上述操作时(例如,使用$ BRANCH =“ nick”),我得到“致命的:找不到远程引用refs / heads / nick”。似乎对我没有用……
尼克,

3
请注意,-t $BRANCH即使没有-f,它也可以工作,它将立即获取。然后,git fetch origin将获取并git checkout $BRANCH建立本地分支和检出。当您需要在提取之前配置远程服务器时,这很有用git config remote.origin.uploadpack=/bin/upload-pack
cdunn2001 '02

1
当我使用“旧的”公司git(1.6.0.2)时,我必然会遇到上述解决方案。我和@Nick有同样的问题。执行git branch -a显示origin/$BRANCH。正在git checkout origin/$BRANCH解决这个问题。
2014年

30

您可以尝试漫长的方法:

mkdir newrepo.git
cd newrepo.git
git init
git remote add origin file:///path/to/original
git fetch origin branchiwant:refs/remotes/origin/branchiwant
git checkout -b branchiwant --track origin/branchiwant

这是什么:

  • 创建并初始化一个空的Git存储库。
  • 将原始存储库添加为名为origin的远程站点
  • 仅从远程调用origin提取所需的分支。
  • 创建并签出一个新分支,该分支设置为跟踪刚刚克隆的源分支。

希望那会是你所追求的。


git remote add的参数已交换,但后来无法结帐。“ git checkout origin / rails”给我“错误:pathspec'origin / rails'与git已知的任何文件都不匹配。” 另一种选择是给我“致命的:git checkout:更新路径与切换分支不兼容”。
Casey Rodarmor 09年

@rodarmor:纠正了git remote命令,谢谢。您可以粘贴的输出git branch -r吗?
jkp

@jkp,实际上git branch -r没有输出。
Casey Rodarmor 09年

@rodarmor:我已经纠正了这个例子,这确实可行(经过测试)。HTH(您可以通过自己喜欢的测试来接受它;))
jkp

-b开关相对较新。上次我在Debian压缩程序上运行它时无法使用,IIRC
2011年

23

您可以使用以下命令进行操作:

git clone -b branch_name --single-branch project_url local_folder_to_clone_in

2
完美地工作,实际上我在源代码树中克隆单个分支时遇到问题,因此手动进行了
azhar22k

17

git-clone手册页

--single-branch在克隆过程中是您的朋友吗?请记住与一起使用,--branch <branch name>否则只会克隆远程主HEAD(默认情况下为master)

永远记得做Ctrl+ F5阅读新鲜的资源,而不是从缓存中获取的内容:-)(我很久不知道这个选项了。)


1
git clone <url> --branch <branch> --single-branch <folder>
shridutt kothari 2015年

17
git clone <url> --branch <branch> --single-branch

只需输入URL和分支名称。


8

仅克隆一个分支。这是最简单的方法:

$ git clone -b BRANCH_NAME --single-branch git@bitbucket.org:___/PROJECTNAME.git

4

要克隆特定分支,可以执行以下操作:

git clone --branch yourBranchName git@yourRepository.git


3

要克隆您没有公钥的Git分支,请使用以下命令:

git clone -b <branch> <Git repository URL or clone URL you get from Git repository>

2

打开cmd。

cd folder_name (输入克隆分支的路径)

只需一个命令:

git clone url_of_projecturltoclone -b branch_name

2

有点晚了,但是我想添加我用来解决这个问题的解决方案。我在这里找到了解决方案。

无论如何,问题似乎是在问“如何从另一个存储库的分支开始一个新项目?”

为此,我使用的解决方案是首先在github或任何地方创建一个新的仓库。这将作为您新项目的仓库。

在本地计算机上,导航到具有要用作新项目模板的分支的项目。

运行命令:

git push https://github.com/accountname/new-repo.git +old_branch:master

要做的是将old_branch推送到new-repo,并将其设置为新repo的主分支。

然后,您只需要将新存储库克隆到新项目的本地目录中,并在旧分支处启动一个新项目即可。


2

让我们以烧瓶回购为例。除母版外,它还有3个分支。让我们签出1.1.x远程分支

克隆git repo

git clone https://github.com/pallets/flask

cd进入仓库。

cd flask

获取远程分支1.1.x

git fetch origin 1.1.x

结帐分支

git checkout 1.1.x

您将切换到分支1.1.x,它将跟踪远程1.1.x分支。



0

如果要浅克隆,可以使用以下方法进行:

git clone -b mybranch --depth=1 https://example.com/myproject.git localname

--depth=1暗示--single-branch


0

主要有两种解决方案:

  1. 您需要使用-b命令开关指定分支名称。这是克隆特定git分支的命令的语法。

git clone -b <BRANCH_NAME> <GIT_REMOTE_URL>

示例: git clone -b tahir https://github.com/Repository/Project.git

以下命令将从git存储库中克隆分支tahir。上面的命令仅克隆特定分支,但获取其他分支的详细信息。您可以使用命令查看所有分支的详细信息。 git branch -a

  1. 您可以使用'--single-branch'标志来防止获取其他分支的详细信息,如下所示:

git clone -b <BRANCH_NAME> --single-branch <GIT_REMOTE_URL>

示例: git clone -b tahir --single-branch https://github.com/Repository/Project.git

现在,如果执行a git branch -a,它将仅显示您已克隆的当前单个分支,而不是所有分支,因此这取决于您所需的方式。

希望有一天能对某人有所帮助!! ...


0

如果要保持分支独立,可以使用此命令来混合单个分支并重命名文件夹

git clone -b [branch-name] --single-branch [url]  [folder_name]

git clone -b mybranch --single-branch git://github/repository.git  project_mybranch


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.