如何将本地git仓库中的所有远程分支转换为本地跟踪分支,而无需逐个检查每个分支。
你可能想要这样做的一个原因(我想这样做的原因)是你可以克隆本地仓库并在新克隆中拥有原始远程原点的所有分支。
因为“克隆”只克隆本地分支。
编辑:提供了几个脚本答案(为此 - 谢谢!)...我真的希望有一种in-git方式,因此它是完全可移植的(我的用户是“仅限Windows” ,到目前为止,没有使用bash(git-bash或其他)),幸存下来。
答案 0 :(得分:4)
这句话由jast在freenode上的#git提供给我:
git push . refs/remotes/origin/*:refs/heads/*
注意:如下面的评论所述,这不会创建跟踪分支,但它至少会使本地仓库中的分支成为“本地”并注意“远程”。
答案 1 :(得分:3)
最好的方法是使用脚本:
#!/bin/bash
IFS=$'\n'
for branch in `git branch -r`; do
if [[ ${branch} =~ ^\ *(.+)/(.+)$ ]]; then
git show-branch "${BASH_REMATCH[2]}" > /dev/null 2>&1
if [ $? -ne 0 ]; then
git branch ${BASH_REMATCH[2]} ${BASH_REMATCH[1]}/${BASH_REMATCH[2]}
fi
fi
done
答案 2 :(得分:2)
我认为@cforbish的答案只能通过说明使用该脚本生成如下命令来改进:
# git branch <local-branch-name> <remote-name>/<remote-branch-name>
例如,如果您有以下远程分支:
# git remote -v
remote-repo <repo-directory> (fetch)
remote-repo <repo-directory> (push)
# git branch -r
remote-repo/branch1
remote-repo/branch2
remote-repo/branch3
您可以通过以下方式运行本地跟踪分支:
# git branch branch1 remote-repo/branch1
# git branch branch2 remote-repo/branch2
# git branch branch3 remote-repo/branch3
# git branch
branch1
branch2
branch3
答案 3 :(得分:1)
我喜欢shell-command-builders这样的东西。这比早期版本更加丑陋,但它也适用于裸机shell,并且具有额外的优势,即以正确的顺序构建分支命令的args,以便它们实际工作。
有一件事 - 像这样的scriplets “in-git solutions”。
git-track-all-remote-branches ()
{
awk '
$0=="////"{doneloading=1;next}
!doneloading {drop[$0]=1;next}
!drop[$0] {
print "b='\''"$0"'\''; git branch -t ${b##*/} $b"
}' <<///EOD///
$(git for-each-ref --format="%(upstream:short)" refs/heads)
////
$(git for-each-ref --format="%(refname:short)" refs/remotes)
///EOD///
}
最新的checkout
功能是,如果您签出一个当前不是分支的裸名称,但只匹配一个远程分支,它将自动为它设置跟踪分支:
$ git branch
master
$ git branch -r
origin/notyet
origin/master
$ git checkout notyet
Checking out files: 100% (2/2), done.
Branch notyet set up to track remote branch notyet from origin.
Switched to a new branch 'notyet'