如何将本地git仓库中的所有远程分支转换为本地跟踪分支

时间:2013-11-04 11:52:58

标签: git remote-branch

如何将本地git仓库中的所有远程分支转换为本地跟踪分支,而无需逐个检查每个分支。

你可能想要这样做的一个原因(我想这样做的原因)是你可以克隆本地仓库并在新克隆中拥有原始远程原点的所有分支。

因为“克隆”只克隆本地分支。

编辑:提供了几个脚本答案(为此 - 谢谢!)...我真的希望有一种in-git方式,因此它是完全可移植的(我的用户是“仅限Windows” ,到目前为止,没有使用bash(git-bash或其他)),幸存下来。

4 个答案:

答案 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'