Git捆绑添加远程

时间:2013-12-07 20:56:24

标签: git

我正在为本地git repo做一个备份脚本。 我查看了可能性,并选择了捆绑来完成任务。 我采取的步骤:

  1. 创建一个新的仓库,进行初始提交

    当我用git branch -a检查回购时,我得到以下信息: * master

  2. git bundle create ./test.bundle --all

  3. 到目前为止,当我用git bundle list-heads检查捆绑包时 我得到2个引用:1个用于HEAD,另一个用于refs / heads / master。

    当我将此捆绑包带入git clone的新存储库时,分支看起来像这样:

    *master
    remotes/origin/HEAD -> remotes/origin/master
    remotes/origin/master
    

    为什么会这样?有没有办法只导入第一个存储库中没有遥控器的分支?

    编辑:

    我的问题可能有点不清楚。这是我想要实现的目标:

    1. 拥有2个分支,主人和测试的回购。
    2. 捆绑所有分支(按照建议使用git bundle --branches完成)
    3. rm整个回购
    4. 使用git clone恢复repo。不幸的是我必须给出一个分支参数,因为没有它我得到以下错误: warning: remote HEAD refers to nonexistent ref, unable to checkout.
    5. 出现的唯一问题是我在克隆后得到以下分支:

      *master
      remotes/origin/master
      remotes/origin/test
      

      切换到测试后,我收到一条消息,表明已经建立了新分支。有没有办法克隆所有分支,使它看起来像原始的回购?

      *master
      test
      

2 个答案:

答案 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?