928

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

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

如果我想检查一个新项目的主分支,我可以这样做

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 骨架存储库的单个项目。

4

25 回答 25

1015

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

# 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,并且不引用自身克隆的分支)

你可以看到它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(2020 年第一季度)中,“ git clone --recurse-submodules --single-branch现在在克隆子模块时使用相同的单分支选项

请参阅Emily Shaffer ( ) 的提交 132f600提交 4731957(2020 年 2 月 21 日(由Junio C Hamano 合并 -- --提交 b22db26中,2020 年 3 月 5 日)nasamuffin
gitster

clone: 在 --recurse-submodules 期间通过 --single-branch

签字人:Emily Shaffer
签字人:Jeff King

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

管道--single-branch通过子模块帮助框架,稍后使其成为“ clone”。

于 2012-03-29T07:34:01.897 回答
686

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

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
于 2011-08-12T02:02:38.673 回答
115

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

于 2010-11-10T16:44:50.400 回答
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的远程获取您需要的分支。
  • 创建并签出一个新分支,该分支设置为跟踪您刚刚克隆的源分支。

希望这会是你所追求的。

于 2009-11-22T08:10:46.470 回答
26
git clone <url> --branch <branch> --single-branch

只需输入 URL 和分支名称。

于 2017-03-01T10:32:12.957 回答
25

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

git clone -b branch_name --single-branch project_url local_folder_to_clone_in
于 2015-08-06T06:21:19.090 回答
18

git-clone 手册页

--single-branch是你的朋友在克隆期间记得使用--branch <branch name>或只克隆远程主 HEAD(默认情况下为 master)

永远记得做Ctrl+F5来读取新的源代码,而不是来自缓存的源代码 :-) (我不知道这个选项很长时间了。)

于 2013-02-25T13:10:18.013 回答
9

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

git clone -b BRANCH_NAME --single-branch git@bitbucket.org:___/PROJECTNAME.git
于 2018-03-02T10:18:15.410 回答
5

这里有很多答案提到:

  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.git
cd micronucleus  # cd into the repo you just cloned
git 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/master号和origin/version_2.5

$ git branch -a
* version_2.5
  remotes/origin/HEAD -> origin/master
  remotes/origin/master
  remotes/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远程中所有分支的所有头。我不是这方面的专家,但我相信这就是+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.git
cd micronucleus  # cd into the repo you just cloned
git checkout version_2.5

# Delete ALL other branches, including remote-tracking ones, which are not the 
# `version_2.5` branch:
# One local branch
git branch -d master
# ALL other locally-stored remote-tracking branches
git branch -dr origin/HEAD 
git 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进行配置,以便当我们调用git fetchgit pull

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

git branch -a向我们展示了只有version_2.5分支被克隆和签出。在这里,我们看到*哪个分支被签出,我们还看到我们有一个本地存储的远程跟踪分支origin/version_2.5

$ git branch -a
* version_2.5
  remotes/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命令只会从远程分支获取version_2.5分支头。origin/version_2.5而已!请注意,永远不会获取其他远程分支。

概括:

所以,现在你看到 using-b branch_name基本上只是确保branch_name分支在克隆之后被签出,但仍然克隆所有远程分支,而添加也--single-branch确保只branch_name克隆、获取、拉取和跟踪。任何其他远程分支都不会克隆到您的 PC 上。

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

参考:

  1. 只克隆一个分支
  2. 你如何停止在 Git 中跟踪远程分支?
于 2020-09-06T06:05:42.860 回答
4

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

git clone --branch yourBranchName git@yourRepository.git
于 2018-05-23T16:27:27.053 回答
3

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

git clone -b <branch> <Git repository URL or clone URL you get from Git repository>
于 2017-08-15T20:19:17.513 回答
2

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

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

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

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

运行命令:

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

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

然后,您只需将新的 repo 克隆到新项目的本地目录,并且您在旧分支上启动了一个新项目。

于 2019-06-03T21:17:21.580 回答
2

主要有两种解决方案:

  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
    

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

于 2020-02-17T07:32:25.390 回答
2

打开cmd。

cd folder_name  # enter the path where to clone the branch

只有一个命令:

git clone url_of_projecturltoclone -b branch_name
于 2017-05-02T05:11:36.260 回答
2

让我们以烧瓶回购为例。除了master之外,它还有3个分支。让我们检查一下 1.1.x 远程分支

克隆 git 仓库

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 分支。

于 2019-07-31T11:30:27.170 回答
1

️一些性能测量️</h1>

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

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

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

我用一个历史悠久、分支众多的大项目对此进行了测试,这种方法大约需要 6s。

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

亚军

相比之下,frerich-rabe方法始终需要 26 秒:

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

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

于 2021-11-01T15:04:29.957 回答
1

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

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

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

于 2020-01-20T23:59:27.760 回答
1

这应该工作

git clone --single-branch <branchname> <remote-repo-url>
git clone --branch <branchname> <remote-repo-url>
于 2020-12-09T10:38:16.357 回答
1

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

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

例子

git clone -b mybranch --single-branch git://github/repository.git  project_mybranch
于 2020-05-06T13:23:42.393 回答
0
git clone --branch {branch-name} {repo-URI}

例子:

git clone --branch dev https://github.com/ann/cleaningmachine.git
于 2020-05-28T16:20:57.940 回答
0

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

git clone https://gitlab.com/repo/repo.git --branch <name of branch> --single-branch
于 2020-08-25T16:07:18.690 回答
0

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

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

git clone -b <name_of_branch> --single-branch <git_url> folder_to_clone_locally
于 2020-01-05T04:53:51.710 回答
0
git clone --single-branch -b [branch name]  [repository URL]
于 2021-10-25T06:50:42.283 回答
0

我是这样做的

git clone -b <branch_name> 网址

例子 :

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

或者

git clone -b master git@gitlab.com:jhondoe/applicationproject.git
于 2021-10-18T05:01:30.690 回答
-4

可以分2步完成

  1. 克隆存储库

    git clone <http url>
    
  2. 结帐您想要的分支

    git checkout $BranchName
    
于 2015-09-12T18:10:44.897 回答