(1) 在桌面上,将 repo 克隆到一个临时目录中(您将在其中按照您希望它们在笔记本上的方式设置所有分支标签)。让我们使用一个(裸)--mirror
克隆来避免对工作目录大惊小怪,并节省一些空间,同时还将所有 ref 复制到一个膨胀的 foop 中:
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) 现在将其克隆到笔记本中,作为新的存储库:
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
and /tmp/for_notebook/repo.git
as origin
。(我通常通过直接编辑来做到这一点.git/config
。)根据需要与笔记本的原始存储库进行比较.git/config
。
(旧的 reflog 现在已经消失了,git stash
你保存的所有 es 都没有了,因为这些都是没有被复制到的本地 refs desktop
。)