3

如何将本地 git repo 中的所有远程分支转换为本地跟踪分支,而无需一一检查。

您可能想要执行此操作的一个原因(我想要执行此操作的原因)是您可以克隆本地存储库,并在该新克隆中包含来自原始远程源的所有分支。

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

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

4

4 回答 4

5

这个答案是 jast 在 freenode 的 #git 上提供给我的:

git push . refs/remotes/origin/*:refs/heads/*

注意:正如下面评论中提到的,这不会创建跟踪分支,尽管它至少使本地 repo 中的分支成为“本地”并注意“远程”。

于 2013-11-04T11:52:58.003 回答
4

最好的方法可能是使用脚本:

#!/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
于 2013-11-04T12:59:35.123 回答
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
于 2016-04-08T00:11:54.007 回答
1

我喜欢 shell-command-builders 这样的东西。这比早期版本更难看,但它也适用于准系统外壳,并且具有额外的优势,即它以正确的顺序获取分支命令上的参数,以便它们实际工作。

一件事——像这样的脚本“in-git 解决方案”。

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'
于 2013-11-04T14:31:26.460 回答