如何将本地 git repo 中的所有远程分支转换为本地跟踪分支,而无需一一检查。
您可能想要执行此操作的一个原因(我想要执行此操作的原因)是您可以克隆本地存储库,并在该新克隆中包含来自原始远程源的所有分支。
因为“克隆”只克隆本地分支。
编辑:已经提供了几个脚本答案(为此 - 谢谢!)......我真的希望有一种 in-git 方式,因此它是完全可移植的(我有“仅限 Windows”的用户,所以far 无需使用 bash(git-bash 或其他)就可以幸存下来)。
如何将本地 git repo 中的所有远程分支转换为本地跟踪分支,而无需一一检查。
您可能想要执行此操作的一个原因(我想要执行此操作的原因)是您可以克隆本地存储库,并在该新克隆中包含来自原始远程源的所有分支。
因为“克隆”只克隆本地分支。
编辑:已经提供了几个脚本答案(为此 - 谢谢!)......我真的希望有一种 in-git 方式,因此它是完全可移植的(我有“仅限 Windows”的用户,所以far 无需使用 bash(git-bash 或其他)就可以幸存下来)。
这个答案是 jast 在 freenode 的 #git 上提供给我的:
git push . refs/remotes/origin/*:refs/heads/*
注意:正如下面评论中提到的,这不会创建跟踪分支,尽管它至少使本地 repo 中的分支成为“本地”并注意“远程”。
最好的方法可能是使用脚本:
#!/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
我认为@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
我喜欢 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'