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

我在~/local_repo中有一个本地Git存储库。它有几个分支:

$ git branch* masterrailscc++

要克隆本地存储库,我做:

$ git clone ~/local_repo new_repoInitialized empty Git repository in /home/username/new_repo/.git/

new_repo主分支指向local_repo主分支,我可以推/拉。

但是我无法克隆另一个分支。我只想拉取我想要的分支(例如rails),这样新的存储库就有一个master分支,默认情况下可以推送到local_reporails分支。我该如何完成这一点,或者类似于local_repo跟踪主local_repo

899571 次浏览

你可以试试长篇大论的方法:

mkdir newrepo.gitcd newrepo.gitgit initgit remote add origin file:///path/to/originalgit fetch origin branchiwant:refs/remotes/origin/branchiwantgit checkout -b branchiwant --track origin/branchiwant

它的作用是:

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

希望这将是你所追求的。

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

mkdir $BRANCHcd $BRANCHgit initgit remote add -t $BRANCH -f origin $REMOTE_REPOgit checkout $BRANCH

这种方法的优点是后续的git pull(或git fetch)调用也会下载请求的分支。

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

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

其中branch_name是您选择的分支,“/你的/文件夹”是该分支的目标文件夹。这确实会带来其他分支,让您有机会来回合并。

更新

现在,从Git 1.7.10开始,您现在可以这样做

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

注意:git1.7.10实际上允许您只克隆一个分支

# clone only the remote primary HEAD (default: origin/master)git clone <url> --single-branch
# as in:git clone <url> --branch <branch> --single-branch <folder>

备注:

  • <url>是远程存储库的URL,不引用克隆的分支
  • <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月)以来,浅层克隆支持数据搬迁(推/拉),因此该选项现在更加有用。查看更多“#0(浅克隆)比它想象的更有用吗?”。


“撤消”浅克隆在“将浅克隆转换为完整克隆”中详细说明(git 1.8.3+)

# unshallow the current branchgit 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现在在克隆子模块时使用相同的单分支选项

提交132f600提交4731957(2020年2月21日)by艾米丽·谢弗(#0)
(由提交b22db26中的Junio C Hamano----#0----合并,2020年3月5日)

clone:在--的子模块中传递--monle-分支

署名:Emily Shaffer
作者:Jeff King

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

管道--single-branch通过子模块帮助框架,使其稍后进入'clone'。

git-clone手册页

--single-branch是你克隆时的朋友请记住与--branch <branch name>一起使用,否则将仅克隆远程主HEAD(默认情况下为master)

永远记住Ctrl+F5读取新鲜的源代码,而不是缓存中的那个:-)(我不知道这个选项很长一段时间)

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

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

可以分2步完成

  1. 克隆仓库

    git clone <http url>
  2. 检查你想要的分支

    git checkout $BranchName
git clone <url> --branch <branch> --single-branch

只需输入URL和分支机构名称。

打开cmd。

cd folder_name  # enter the path where to clone the branch

只有一个命令:

git clone url_of_projecturltoclone -b branch_name

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

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

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

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

对于克隆特定分支,您可以执行以下操作:

git clone --branch yourBranchName git@yourRepository.git

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

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

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

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

运行命令:

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

这将做的是将old_branch推送到new-repo并使其成为新repo的主分支。

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

让我们以flask repo为例。除了master之外,它还有3个分支。让我们检查1.1. x远程分支

克隆git repo

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

cd到repo。

cd flask

获取远程分支1.1. x

git fetch origin 1.1.x

检查分支

git checkout 1.1.x

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

类似于@nosaiba-darish在这里所说的:这里

这是我们公司通常做的事情:

git clone -b <name_of_branch> --single-branch <git_url> folder_to_clone_locally

如果你想要一个浅克隆,你可以这样做:

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

--depth=1意味着--single-branch

对此主要有两种解决方案:

  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
  2. 您可以使用--single-branch标志来防止获取其他分支的详细信息,如下所示:

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

    示例:

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

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

如果您想保持分支独立,您可以使用此命令git单分支并重命名文件夹

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

示例

git clone -b mybranch --single-branch git://github/repository.git  project_mybranch
git clone --branch {branch-name} {repo-URI}

示例:

git clone --branch dev https://github.com/ann/cleaningmachine.git

对于像我这样的新手,只需运行下面的代码

git clone https://gitlab.com/repo/repo.git --branch <name of branch> --single-branch

这里有很多答案,其中提到:

  1. 下载1分支(--single-branch部分):

    # (We'll refer to this as "the 1st command" below.)# 1. Clone ONLY `branch_name`, then check it out. The `--single-branch` part#    means that ONLY `branch_name` is cloned, fetched, pulled, and#    tracked. _No other remote branches will be cloned to your PC#    whatsoever._git clone -b branch_name --single-branch \https://github.com/some_project/some_project.git

    …或者某个版本,还有一些只是提到:

  2. 下载所有分支(不带--single-branch部分):

    # (We'll refer to this as "the 2nd command" below.)# 2. Clone ALL remote branches, then `git checkout` the `branch_name`#    branch.git clone -b branch_name \https://github.com/some_project/some_project.git

但是,我想稍微阐述一下这两件事,并展示一组更熟悉的等效命令,这样我们就可以看到每个引擎盖下发生了什么。

让我们假设您在GitHub上有一个位于https://github.com/micronucleus/micronucleus.git的远程存储库,具有远程分支masterversion_2.5(这是一个您现在可以实际运行的真实示例)。

上面第二个命令的细目:

第二次指挥git clone -b version_2.5 https://github.com/micronucleus/micronucleus.git)将所有远程分支克隆到您的本地PC,但随后签出version_2.5分支而不是master分支。这一个命令相当于这样做:

git clone https://github.com/micronucleus/micronucleus.gitcd micronucleus  # cd into the repo you just clonedgit checkout version_2.5# To be pedantic, also delete the local `master` branch since# technically it won't exist yet since you haven't yet checked# it out with `git checkout master`, which would create it from# your locally-stored remote-tracking branch, `origin/master`git branch -d master

-b version_2.5部分自动为我们签出version_2.5分支,而不是master

git branch -a向我们显示所有分支都被克隆到我们的本地PC上。在这里您可以看到我们所在的本地分支version_2.5,加上本地存储的远程跟踪分支origin/HEAD(指向origin/master),加上origin/masterorigin/version_2.5

$ git branch -a* version_2.5remotes/origin/HEAD -> origin/masterremotes/origin/masterremotes/origin/version_2.5

我们还可以查看我们的fetch引用是什么。您可以打开.git/config文件直接查看它们,或者只需运行git config remote.origin.fetch

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

您可以在上面看到我们的git fetch命令(也由git pull触发,因为它等效于git fetch && git merge)被配置为获取origin远程中所有分支的ALL头。我不是这部分的专家,但我相信这就是+refs/heads/*:refs/remotes/origin/*的意思。

上面第一个命令的细目:

第一个命令git clone -b version_2.5 --single-branch https://github.com/micronucleus/micronucleus.git)只克隆version_2.5分支到您的本地PC,它也会检查它。这一条命令相当于这样做(至少在最终结果中,除了它在开始时下载的数据要少得多,因为它只克隆了一个分支而不是所有分支):

git clone https://github.com/micronucleus/micronucleus.gitcd micronucleus  # cd into the repo you just clonedgit checkout version_2.5
# Delete ALL other branches, including remote-tracking ones, which are not the# `version_2.5` branch:# One local branchgit branch -d master# ALL other locally-stored remote-tracking branchesgit branch -dr origin/HEADgit branch -dr origin/master
# Fix your `.git/config` file so that `git fetch` does the right thing, fetching# ONLY the `version_2.5` branch head from the `origin/version_2.5` remote branch:git config remote.origin.fetch \"+refs/heads/version_2.5:refs/remotes/origin/version_2.5"

默认情况下,-b version_2.5部分导致签出version_2.5分支而不是master分支(如上所述),而--single-branch部分导致:

  1. 没有其他分支被克隆到我们的PC
  2. git fetch配置为当我们调用#0或#2时,不会获取其他分支!

此命令真正克隆,并且只会获取我们想要的一个分支,就这样了!

git branch -a向我们显示只有version_2.5分支被克隆并签出。这里我们通过*看到哪个分支被签出,我们还看到我们有origin/version_2.5本地存储远程跟踪分支:

$ git branch -a* version_2.5remotes/origin/version_2.5

我们还可以查看我们的fetch引用是什么。您可以打开.git/config文件直接查看它们,或者只需运行git config remote.origin.fetch

$ git config remote.origin.fetch+refs/heads/version_2.5:refs/remotes/origin/version_2.5

您可以在上面看到,我们的git fetch命令只会从origin/version_2.5远程分支获取version_2.5分支头。就是这样!注意永远不会获取其他远程分支。

总结:

所以,现在你看到使用-b branch_name基本上只是确保branch_name分支在克隆之后签出,但仍然克隆所有远程分支,而添加--single-branch也确保只有branch_name被克隆、获取、拉取和跟踪。

就个人而言,我更喜欢单独使用-b branch_name选项,因为我希望所有分支克隆到我的本地PC上。一个例外可能是在一个巨大的共享单仓上,它有几十个,甚至数百或数千个远程分支。在这种情况下,只需使用-b branch_name --single-branch来克隆你关心的一个主分支并完成。例如,在一个巨大的单仓中为master分支下载50 GiB的数据比下载200 GiB的数据好,这样你就可以有2000个同行的分支也在工作!

参考文献:

  1. 只克隆一个分支
  2. 如何停止跟踪Git中的远程分支?

这应该能行

git clone --single-branch <branchname> <remote-repo-url>git clone --branch <branchname> <remote-repo-url>

我是这样做的

git clone-burl

例子:

git clone -b master https://gitlab.com/jhondoe/applicationproject.git

git clone -b master git@gitlab.com:jhondoe/applicationproject.git
git clone --single-branch -b [branch name]  [repository URL]

🏎️一些性能测量🏎️

我比较了两种建议的方法,发现一种比另一种更快(更小)(如果你唯一的目标是克隆,并且你不关心其他事情,这是有利的)。

我发现最重要的性能指标是--depth,这意味着VonC回答是最快的。你自己试试:

time bash -cl "git clone --single-branch --depth=1 --branch=$MYBRANCH $MYGITURL"

我用一个有着悠久历史和许多分支的大项目测试了这一点,这种方法大约需要6s。

请注意,与此线程中的几个注释所声称的相反,(至少在最近的git版本中),这将仅checkout目标分支。git branch -a仅列出该单个分支。

亚军

相比之下,弗里里希-拉贝方法始终需要26秒:

time bash -cl "git init && git remote add -t $MYBRANCH -f origin $MYGITURL && git checkout $MYBRANCH"

在比较两者时,同样重要的是要注意,在我的例子中,目标分支是其父分支的精简版本。第一种方法的下载进度条反映了大小的减少(<10MB),而第二种方法没有(>90MB)。(我敢肯定,有更成熟的方法来测量总下载大小,但我还没有研究过。)

git clone --branch <branchname> <remote-repo-url>

git clone -b <branchname> <remote-repo-url>