Git捆绑包添加远程:将远程库添加到Git捆绑包中

3
我正在为本地git仓库编写备份脚本。 我研究了一些可能性,并选择了bundle来完成任务。 我所采取的步骤如下:
1. 创建一个新的仓库,进行初始提交 当我用“git branch -a”检查该仓库时,我会得到以下结果: * master 2. 运行“git bundle create ./test.bundle --all”
现在,当我使用“git bundle list-heads”检查bundle时, 我会得到2个引用:1个是HEAD,另一个是refs/heads/master。
当我使用“git clone”将这个bundle拉入新的仓库时,分支看起来是这样的:
*master
remotes/origin/HEAD -> remotes/origin/master
remotes/origin/master

为什么会发生这种情况?有没有一种方法可以只导入第一个仓库中的分支而不包括远程分支?
编辑:
我的问题可能有点不清楚。这是我想要实现的内容:
1. 有一个包含2个分支(master和test)的仓库。 2. 捆绑所有分支(使用建议的git bundle --branches完成)。 3. rm整个仓库。 4. 使用git clone恢复仓库。不幸的是,我必须提供一个分支参数,因为如果没有它,会出现以下错误:warning: remote HEAD refers to nonexistent ref, unable to checkout. 克隆后我得到了以下分支,这是唯一的问题:
*master
remotes/origin/master
remotes/origin/test

切换到测试模式后,我收到了一条消息,说已经创建了一个新的分支。是否有方法可以克隆所有分支,使其看起来像原始仓库?
*master
test
2个回答

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

但我不确定这是否会有很大的影响。虽然我从未使用过bundle,所以也许这个答案可以得到改进。
更新
当你从bundle克隆时,bundle被视为一个远程仓库,在你的新克隆点的视角下成为新的origin。当你克隆时,只为HEAD创建了本地分支,其他分支保留在origin。如果你想完全摆脱bundle,你可以为bundle远程(= origin)中的所有分支创建本地分支,然后删除远程和bundle,像这样:
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

在运行此命令之前,请确保您处于干净的状态,没有任何待处理或暂存的更改。

但是,--branches HEAD 不仅仅只是将 head 存储在 bundle 中吗?我想要将所有的 branches 都存储在 bundle 中。 - Bartlomiej Lewandowski
“--branches” 将添加所有的 “refs/heads/*”,也就是所有的分支。这听起来像是你想要做的事情。你试过了吗? - janos
这将创建一个包含两个远程引用的捆绑包 - 一个是主分支,另一个是我创建的测试分支。 - Bartlomiej Lewandowski
@BartlomiejLewandowski 你似乎有点困惑。当你从bundle克隆时,该bundle被视为一个远程仓库,也就是新的origin, 从新克隆的代码的角度来看。当你克隆时,只会为HEAD创建一个本地分支,其他分支仍停留在origin。如果你想将这些分支作为本地分支使用,你需要像任何其他远程仓库一样创建本地分支。此外,你似乎忽略了我建议命令中的HEAD参数,这样你就不会遇到你在更新中提到的无HEAD状态。 - janos

1
我找到了答案,以下是我所做的:
根据janos的建议,我创建了一个包含所有分支的bundle。 对结果进行git克隆。现在对于每个引用,我检出该分支并删除远程分支。
最后,我删除了远程HEAD引用。
我发现这个问题非常有用: 如何在Git中克隆所有远程分支?

看起来你在我给你的命令中忽略了 HEAD 参数:git bundle create test.bundle --branches HEAD。它是为了避免你在更新中提到的警告。我还更新了我的帖子,加入了一个脚本来检出所有远程分支。如果能点个赞并接受答案就太好了... - janos

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接