(1) 在桌面上,将 repo 克隆到一个临时目录中(您将在其中按照您希望它们在笔记本上的方式设置所有分支标签)。让我们使用(裸露的)--mirror 克隆来避免对工作目录大惊小怪,并节省一些空间,同时还将所有 refs 复制到一个膨胀的循环中:
desktop$ mkdir /tmp/for_notebook; cd /tmp/for_notebook # or similar
desktop$ git clone --mirror /path/to/repo
现在您有了/tmp/for_notebook/repo.git(--bare 和/或--mirror 倾向于添加.git),设置此克隆中的所有分支标签以匹配它们在笔记本上的位置:
desktop$ cd repo.git # i.e., /tmp/for_notebook/repo.git
desktop$ for refname in # ok, now see below
您可以在此处手动或通过脚本执行操作。如果分支数量很少,您可以手动列出它们:
desktop$ for refname in fix/issue1 master; do
> git update-ref refs/heads/$refname refs/remotes/notebook/$refname
> done
如果有很多,您可以使用 git for-each-ref 自动执行此操作,但它会为您提供需要更多 shell 脚本编写的长(ish,不妨使用完整名称):
desktop$ for fullname in $(git for-each-ref \
> --format '%(refname)' refs/remotes/notebook/); do
> refname=${fullname#refs/remotes/notebook/}
> git update-ref refs/heads/$refname $fullname
> done
此时git branch 应该只为您提供您期望的分支,但如果有额外的,您可以使用git branch -d 删除它们。
(2) 现在将其克隆到笔记本中,作为一个新的 repo:
notebook$ git clone ssh://desktop.name//tmp/for_notebook/repo.git repo
这无疑已经建立了master 分支;你只需要添加其他分支。重新更新master 是无害的,所以,和以前一样,除了遥控器现在是origin/* 而不是for_notebook/*:
notebook$ for fullname in $(git for-each-ref \
> --format '%(refname)' refs/remotes/origin/); do
> refname=${fullname#refs/remotes/origin/}
> git update-ref refs/heads/$refname $fullname
> done
此时您可能想要调整配置等,这样您就不会将desktop 和/tmp/for_notebook/repo.git 设置为origin。 (我通常通过直接编辑 .git/config 来做到这一点。)根据需要与笔记本的原始 repo .git/config 进行比较。
(旧的 reflog 现在已经消失了,您保存的所有 git stashes 都没有了,因为这些都是没有被复制到 desktop 的本地 ref。)