我正在为本地git repo做一个备份脚本。 我查看了可能性,并选择了捆绑来完成任务。 我采取的步骤:
创建一个新的仓库,进行初始提交
当我用git branch -a
检查回购时,我得到以下信息:
* master
git bundle create ./test.bundle --all
到目前为止,当我用git bundle list-heads
检查捆绑包时
我得到2个引用:1个用于HEAD,另一个用于refs / heads / master。
当我将此捆绑包带入git clone
的新存储库时,分支看起来像这样:
*master
remotes/origin/HEAD -> remotes/origin/master
remotes/origin/master
为什么会这样?有没有办法只导入第一个存储库中没有遥控器的分支?
编辑:
我的问题可能有点不清楚。这是我想要实现的目标:
git bundle --branches
完成)rm
整个回购warning: remote HEAD refers to nonexistent ref, unable to checkout.
出现的唯一问题是我在克隆后得到以下分支:
*master
remotes/origin/master
remotes/origin/test
切换到测试后,我收到一条消息,表明已经建立了新分支。有没有办法克隆所有分支,使它看起来像原始的回购?
*master
test
答案 0 :(得分:1)
从捆绑中克隆时,捆绑中的分支看起来像克隆中的遥控器。这很正常。
虽然git bundle list-heads
显示原始存储库的远程引用,但您不会在新克隆中看到它们。我的意思是例如:
$ git bundle list-heads test.bundle
a742ee94e8fcef80eb5619f76674bb79d7011742 refs/heads/test2
a8bf0cf603a686ccb75179c64b3392d50ff2f4af refs/heads/master
a8bf0cf603a686ccb75179c64b3392d50ff2f4af refs/remotes/origin/HEAD
a8bf0cf603a686ccb75179c64b3392d50ff2f4af refs/remotes/origin/master
a8bf0cf603a686ccb75179c64b3392d50ff2f4af refs/remotes/origin/test1
a8bf0cf603a686ccb75179c64b3392d50ff2f4af HEAD
然后从中克隆:
$ git clone test.bundle clone2
$ cd clone2
$ git branch -a
* master
remotes/origin/HEAD -> origin/master
remotes/origin/master
remotes/origin/test2
也就是说,原始遥控器没有test1
分支的迹象。
你可以创建一个没有远程引用的包,如下所示:
$ git bundle create test.bundle --branches HEAD
但我不确定这是否会产生重大影响。我从未使用过捆绑包,所以也许这个答案可以改进。
<强>更新强>
从捆绑中克隆时,从新克隆的角度来看,捆绑包被视为远程,新原点。克隆时,仅为HEAD创建本地分支,其他分支保留在原点。如果你想完全摆脱捆绑,你可以为捆绑远程(= origin)中的所有分支创建本地分支,然后删除远程并删除捆绑包,如下所示:
for b in $(git branch -r | grep -v HEAD | cut -f2 -d/); do
git show-ref --verify --quiet refs/heads/$b || git checkout $b
done
在运行此操作之前,请确保您处于干净状态,没有待处理或暂时更改。
答案 1 :(得分:1)
我设法找到了答案。这是我做的:
正如janos所说,我与所有分支机构捆绑在一起。 在结果包上做了一个git clone。现在对于每个ref,我检查了分支,并删除了远程分支。
最后我删除了远程HEAD引用。
我发现这个问题非常有用: How to clone all remote branches in Git?