如何将本地git存储库中的所有远程分支转换为本地跟踪分支,而不需要一个一个检查每个分支。你可能想要这样做的原因之一(我想要这样做的原因)是,这样您就可以复制本地存储库,并在新的克隆版本中拥有来自原始远程源的所有分支。因为“clone”只克隆本地分支。
编辑:已提供了几个脚本答案(感谢!)...我真的希望有一种git内部的方法,这样它就是完全可移植的(我有使用“仅限Windows”的用户,到目前为止他们还没有使用过bash(git-bash或其他方式)。)
这个答案是jast在freenode的#git频道上提供给我的:
git push . refs/remotes/origin/*:refs/heads/*
git pull
在之后不会自动将本地分支指向新的远程分支位置。此外,单独的git push
也无法知道要推送到哪个远程分支。 - cforbishgit config branch.${branch}.remote
。如果它返回空,那么它没有进行跟踪。如果它返回一些东西(通常是 origin
),那么它有一个远程对应分支。另外,我已经回答了你最初的问题。这将设置远程跟踪分支。 - cforbish最好的方法可能是使用脚本:
#!/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
# 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 -r
# git branch branch1 remote-repo/branch1
# git branch branch2 remote-repo/branch2
# git branch branch3 remote-repo/branch3
# git branch
branch1
branch2
branch3
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'
fetch
refspec设置为+refs / *:refs / *
,而不是例如+refs / heads / *:refs / remotes / origin / *
。) - torekremote.origin.url
都有一个对应的remote.origin.pushurl
。如果你希望镜像 - 让我们称之为M
(表示镜像),而“主”仓库为P
,开发人员克隆为D
- 成为“纯镜像”,那么是的,你不希望从D
推送到M
,因为当M
从P
获取时,它们将会丢失;所以D
应该推送到P
。你可以设置一个预接收钩子来告诉M
:“拒绝,改为推送到P
”。 - torekM
设置为镜像,但不要自动从P
更新它(这样它就可以积累开发人员所做的更改);(2) 使用第二个系统来获取来自M
和P
的更改并将其合并后发送到P
和M
;以及 (3) 在步骤 2 的过程中将M
设置为只读,但在其他时间允许开发人员进行读/写。至于这是个好主意还是坏主意,取决于太多其他因素而无法确定。 - torek