一次性克隆Git Hub所有分支

73

我正在尝试使用Linux将整个存储库克隆到我的计算机上。 我使用了

git clone <url>   

我随后进入下载的文件夹并输入以下内容

git branch 

在终端中,它只显示了主分支而没有其他存储库中的分支。如何克隆所有分支?

我知道我可以分别使用每个远程分支。

git checkout -b <name of local branch> origin/<name of remote branch>

但除此之外还有其他的方法吗?


5
git branch -a列出所有分支。另请参阅git branch --help - Keith Thompson
请查看https://dev59.com/ymkv5IYBdhLWcg3w1kSr#10312587。 - Asaph
1
可能是如何在Git中克隆所有远程分支?的重复问题。 - John Pankowicz
7个回答

81

(1) 在git本地仓库中,创建一个新的sh文件。

touch getAllBranches.sh
vi getAllBranches.sh

(2) 将以下内容插入到 getAllBranches.sh 文件中:

for branch in `git branch -a | grep remotes | grep -v HEAD | grep -v master `; do
   git branch --track ${branch#remotes/origin/} $branch
done

(3) 获取所有分支:

chmod +x getAllBranches.sh    
sh getAllBranches.sh

(4)检查本地仓库中的结果:

git branch
例如,我使用存储库:https://github.com/donhuvy/spring-boot
正如您所看到的,我已将所有分支提取到本地机器: enter image description here

两个评论:如果已经添加了上游,可能会出现问题,因此认为脚本应该是“git branch -a | grep remotes | grep -v HEAD | grep -v master | grep -v upstream”(删除上游分支)。 另外,为什么要使用“--track”?不使用该选项是否更一致,即Upstream获取和合并主分支与任何分支相同? - David H
1
不需要。请参见Xiong的答案。 - Adam Burley

57

这并不太复杂,非常简单明了的步骤如下:

克隆完仓库后,运行$ cd myproject

git branch -a 这将显示所有远程分支。

$ git branch -a
* master
  remotes/origin/HEAD
  remotes/origin/master
  remotes/origin/v1.0-stable
  remotes/origin/experimental
如果您想在远程分支上进行工作,您需要创建一个本地跟踪分支:
$ git checkout -b experimental origin/experimental

通过以下命令验证您是否在所需的分支中:

$ git branch

输出结果将会是这样的:

*experimental
master
some branch2
some branch3 

注意 * 符号表示当前分支。


1
我尝试了这种方法。但是在输入git branch后,我只看到masterexperimental分支。还有其他人遇到同样的问题吗? - Brian
@Brian 我相信你现在已经找到了,但关键是使用 -a 开关,即 git branch -a - Jamie S
不确定为什么这个被点赞了,它并没有回答问题——如何一次性克隆所有仓库。 - undefined

23
git clone --bare <repository url goes here> .git

然后,在克隆所有分支的存储库之后,请执行以下操作:

git config --bool core.bare false

git reset --hard

2
这对我来说有效,但是使用--mirror而不是--bare。可以使用以下方式恢复远程分支:for branch in $( git branch -a | sed 's/^..//' ); do git checkout $branch; git branch --set-upstream-to=$branch $branch; done(由于某种原因,$( git branch -a )也会将当前目录中的文件添加到列表中,所以需要用到sed命令)。 - mechalynx
1
"--mirror" 与 "--bare" 具有相同的效果。"--mirror" 创建一个裸仓库。 - Boris EKUE-HETTAH
--bare 对我来说比 --mirror 更好,因为 mirror 创建了一个 .git 文件,这个文件基本上就是 git 创建的隐藏文件。 - Juan Joya
3
git reset --hard 告诉我:"fatal: this operation must be run in a work tree",对于 --bare--mirror 都是如此。 - Kirill
@Kirill 我也是。 - carlos palma
2
“fatal: this operation must be run in a work tree” 的错误信息是因为您没有正确地应用命令。更明确的写法应该是:git clone --bare https://your_repo_name.git your_local_dir/.git,接下来的命令应该在 your_local_dir 中执行,这样就可以完成操作了。 - Ουιλιαμ Αρκευα

17
它只显示了主分支并没有其他在远程库中的分支。如何克隆所有分支?
分支本质上是指向提交的指针。当你执行git clone(或git fetch)时,会从远程仓库检索所有提交以及其所有分支。
但是,git branch不会默认显示远程分支。相反,它会显示本地分支,这些分支可能与存在于远程的分支有关或者没有关系。如果你运行git branch --all,git会报告它所知道的所有分支,包括本地和远程的分支。
值得注意的是,标签不是这样操作的,并且本地和远程标签之间没有区别。

2
你的回答对于理解很有帮助,但并没有回答如何获取所有分支以便可以在它们之间切换(对于我们这些 Git 初学者来说)。所选的答案似乎可以做到这一点,但如果你有更好的想法,我们很乐意听取。 - David H
5
@DavidH 一般来说,你不需要做任何特殊的操作;git branch -a 命令可以显示远程分支,如果你检出一个本地不存在但是远程存在的分支,Git 会自动为你创建一个本地分支。 - Xiong Chiamiov
我现在不适合进行测试 - 我推断如果我看到像“remotes/origin/experimental”这样的分支,那么我只需“git checkout experimental”,它就会像你上面说的那样执行? - David H
2
没错,如果出现问题(我认为旧版本的 git 不会这样做),你可以使用 Amit 在他的答案中提到的较长形式的版本git checkout -b experimental origin/experimental - Xiong Chiamiov

11
我认为这是克隆Git仓库及其所有远程分支的简单解决方案:
# Clone remote repository and all branches
git clone --mirror https://github.com/test/frontend.git frontend/.git

# Change into frontend directory
cd frontend

# Update git config
git config --unset core.bare

# Checkout master branch
git checkout master

5

这是最简单的复制存储库的方法,毫无疑问! - Konrad G
2
非常小心使用 git push --mirror 命令 - 它会用本地的分支列表覆盖远程的分支列表。如果你没有干净地完成步骤1和2,你很可能会破坏你的远程分支。 - smerg
不要在家尝试这个。 - Khalid Bin Huda

3
要下载完整的仓库,包括所有分支,请使用以下命令:git clone --mirror <URI>。这将创建一个名为repository.git的文件夹,除非您给它一个不同的名称。
现在,这会让您完全克隆原始存储库,但由于它处于bare=true模式下,您没有工作树。实际上,您拥有的是.git文件夹,包括所有分支和内容。这是一种花哨的说法,意思是您无法直接访问文件,因为它们被隐藏在git系统中(压缩等)。
要使其成为“普通”的git repo,我们需要将此克隆体内的.git文件夹移到一个新文件夹中,该文件夹将成为我们通常的repo文件夹:mkdir <repo folder name> mv repository.git <repo folder name>/.git cd <repo folder name> git checkout master 请注意,没有单个本地git命令可以下载所有远程分支,因此最简单的方法是确保您已将所有提交推送到源,并使用此--mirror选项重新下载整个存储库。

1
这对我大部分都有效,除了git checkout master失败并显示fatal: this operation must be run in a work tree。从.git\config中删除bare=true即可解决该问题。 - Dave the Sax

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接