我克隆了一个包含许多分支的Git存储库。然而,git分支仅显示一个:
$ git branch
* master
我如何在本地拉所有分支,所以当我执行git分支时,它会显示以下内容?
$ git branch
* master
* staging
* etc...
我克隆了一个包含许多分支的Git存储库。然而,git分支仅显示一个:
$ git branch
* master
我如何在本地拉所有分支,所以当我执行git分支时,它会显示以下内容?
$ git branch
* master
* staging
* etc...
当前回答
以下是我认为可靠的东西:
不更新现有分支的远程跟踪不尝试更新HEAD以跟踪原点/HEAD允许命名为非原点的远程正确引用外壳
for b in $(git branch -r --format='%(refname:short)'); do
[[ "${b#*/}" = HEAD ]] && continue
git show-ref -q --heads "${b#*/}" || git branch --track "${b#*/}" "$b";
done
git pull --all
不需要git fetch,因为将all传递给git pull会将此选项传递给内部fetch。
这个答案值得称赞。
其他回答
对于使用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分支。
这已经在Windows 10上的Red Hat和Git Bash上进行了测试和运行。
TLDR:
for branch in `git branch -r|grep -v ' -> '|cut -d"/" -f2`; do git checkout $branch; git fetch; done;
说明:
一行程序检查,然后获取除HEAD之外的所有分支。
列出远程跟踪分支。
git branch -r
忽略HEAD。
grep -v ' -> '
删除远程的分支名称。
cut -d"/" -f2
签出跟踪单个远程的所有分支。
git checkout $branch
提取已签出的分支。
git fetch
从技术上讲,新的本地分支不需要获取。
这可以用于获取或拉取新的分支,这些分支在远程中都有更改。
只需确保只有在准备合并时才进行拉。
测试设置
使用SSH URL检查存储库。
git clone git@repository.git
之前
检查本地分支机构。
$ git branch
* master
执行命令
执行一行。
for branch in `git branch -r|grep -v ' -> '|cut -d"/" -f2`; do git checkout $branch; git fetch; done;
之后
检查本地分支是否包括远程分支。
$ git branch
cicd
master
* preprod
设置别名:(基于顶部答案)
git config --global alias.track-all-branches '!git fetch --all && for remote in `git branch -r`; do git branch --track ${remote#origin/} $remote; done && git fetch --all'
现在要跟踪所有分支:
git跟踪所有分支
$ git remote update
$ git pull --all
这假设所有分支都被跟踪。
如果他们不是,你可以在Bash中发射这个:
for remote in `git branch -r `; do git branch --track $remote; done
然后运行命令。
注意:请阅读下面的警告注释。
以下是我认为可靠的东西:
不更新现有分支的远程跟踪不尝试更新HEAD以跟踪原点/HEAD允许命名为非原点的远程正确引用外壳
for b in $(git branch -r --format='%(refname:short)'); do
[[ "${b#*/}" = HEAD ]] && continue
git show-ref -q --heads "${b#*/}" || git branch --track "${b#*/}" "$b";
done
git pull --all
不需要git fetch,因为将all传递给git pull会将此选项传递给内部fetch。
这个答案值得称赞。