我克隆了一个包含许多分支的Git存储库。然而,git分支仅显示一个:
$ git branch
* master
我如何在本地拉所有分支,所以当我执行git分支时,它会显示以下内容?
$ git branch
* master
* staging
* etc...
我克隆了一个包含许多分支的Git存储库。然而,git分支仅显示一个:
$ git branch
* master
我如何在本地拉所有分支,所以当我执行git分支时,它会显示以下内容?
$ git branch
* master
* staging
* etc...
当前回答
对于使用PowerShell的Windows用户:
git branch -r | ForEach-Object {
# Skip default branch, this script assumes
# you already checked-out that branch when cloned the repo
if (-not ($_ -match " -> ")) {
$localBranch = ($_ -replace "^.*?/", "")
$remoteBranch = $_.Trim()
git branch --track "$localBranch" "$remoteBranch"
}
}; git fetch --all; git pull --all
其他回答
对于Visual Studio用户,在包管理器控制台上:
git branch | %{ git fetch upstream; git merge upstream/master}
对于使用PowerShell的Windows用户:
git branch -r | ForEach-Object {
# Skip default branch, this script assumes
# you already checked-out that branch when cloned the repo
if (-not ($_ -match " -> ")) {
$localBranch = ($_ -replace "^.*?/", "")
$remoteBranch = $_.Trim()
git branch --track "$localBranch" "$remoteBranch"
}
}; git fetch --all; git pull --all
$ git remote update
$ git pull --all
这假设所有分支都被跟踪。
如果他们不是,你可以在Bash中发射这个:
for remote in `git branch -r `; do git branch --track $remote; done
然后运行命令。
注意:请阅读下面的警告注释。
TL;DR答案
git branch -r | grep -v '\->' | sed "s,\x1B\[[0-9;]*[a-zA-Z],,g" | while read remote; do git branch --track "${remote#origin/}" "$remote"; done
git fetch --all
git pull --all
(似乎pull会从所有遥控器获取所有分支,但我总是先获取,以确保安全。)
仅当服务器上存在本地分支未跟踪的远程分支时,才运行第一个命令。
完整答案
您可以像这样从所有遥控器获取所有分支:
git fetch --all
这基本上是一个有力的动作。
fetch更新远程分支的本地副本,因此这对本地分支总是安全的,但是:
fetch不会更新本地分支(跟踪远程分支);如果要更新本地分支,仍然需要拉动每个分支。fetch不会创建本地分支(跟踪远程分支),您必须手动执行此操作。如果要列出所有远程分支:查看所有的分支
要更新跟踪远程分支的本地分支,请执行以下操作:
git pull --all
然而,这仍然不够。它只适用于跟踪远程分支的本地分支。要跟踪所有远程分支,请在git pull-all之前执行以下oneliner:
git branch -r | grep -v '\->' | sed "s,\x1B\[[0-9;]*[a-zA-Z],,g" | while read remote; do git branch --track "${remote#origin/}" "$remote"; done
P.S.AFAIK git fetch--all和git远程更新是等效的。
Kamil Szot的评论,人们发现这很有用。
我必须使用:对于“gitbranch-r”中的remote;do git branch--跟踪${remote#origin/}$remote;完成因为您的代码创建了名为origin/branchname和每当我参考它。
您可以通过以下方式获取所有分支:
git fetch --all
or:
git fetch origin --depth=10000 $(git ls-remote -h -t origin)
如果您对存储库进行了浅处理,--depth=10000参数可能会有所帮助。
要拉动所有分支,请使用:
git pull --all
如果上面的命令不起作用,那么在上面的命令前面加上:
git config remote.origin.fetch '+refs/heads/*:refs/remotes/origin/*'
因为remote.origin.fetch在提取时只能支持特定的分支,特别是当您使用--single分支克隆回购时。通过:git-config remote.origin.fetch检查此项。
之后,您应该可以签出任何分支。
另请参见:
如何获取所有远程分支?如何克隆Git中的所有远程分支?
要将所有分支推送到远程,请使用:
git push --all
最终--镜像到镜像所有引用。
如果您的目标是复制存储库,请参阅:在GitHub复制存储库文章。