144

我需要将完整的 repo 传输到新的非联网机器,最好作为单个文件实体。git bundle 允许在sneakernet 环境git fetchgit pull进行样式操作,但似乎假设您已经在目标机器上拥有了一个工作版本的repo。

什么是正确的调用:

  1. 捆绑当前仓库中的所有分支
  2. 在目标目录上启动新的 repo,即正确安装 root 提交

我已经向上游发送了一个补丁来澄清:

`git clone` can use any bundle created without negative refspecs
(e.g., `new`, but not `old..new`).
If you want to match `git clone --mirror`, which would clone other
refs such as `refs/remotes/*`, use `--all`.
If you want to provide the same set of refs that a clone directly
from the source repository would get, use `--branches --tags` for
the `<git-rev-list-args>`.

所以$ git bundle create repo.bundle --branches --tags最好匹配克隆。

$ git bundle create repo.bundle --all将提供源机器的镜像,包括它的远程参考。

4

4 回答 4

231

什么是正确的调用:

  • 捆绑当前仓库中的所有分支

简单的:

$ git bundle create repo.bundle --all

repo.bundle是您要创建的捆绑文件的名称。请注意,它--all不包括远程跟踪分支......就像普通克隆也不包括在内。

  • 在目标目录上启动新的 repo,即正确安装 root 提交

首先,clone只是init+ fetch(+ administrativia)。

其次,您可以在可以使用存储库 URL 的任何地方使用捆绑文件,因此您可以简单地clone从捆绑文件中:

$ git clone repo.bundle

这将创建repo为一个 git 存储库。

于 2012-08-03T12:14:48.970 回答
43

首先克隆存储库,并包含该--mirror选项。

git clone --mirror git@example.org:path/repo.git

这确保所有远程分支也是准备捆绑的本地分支。

然后运行

git bundle create repo.bundle --all正如 Jakub Narębski 的回答所描述的那样

于 2015-12-08T14:21:49.620 回答
4

我建议您 tar 或压缩 .git 文件夹,然后将其解压缩到新位置,然后执行git reset --hard HEAD. 所有分支所需的一切都在 .git 下,您需要做的就是调整 .git/config 文件中的任何遥控器或删除它们。

tar cf myrepo.tgz .git
cp myrepo.tgz [USB_STICK]
... move to new machine ...
mkdir myrepo && cd myrepo
tar xpf [USB_STICK]/myrepo.tgz
git reset --hard HEAD
于 2012-08-03T09:16:46.780 回答
2

随着 Git 2.34(2021 年第四季度),git bundle进一步澄清:

请参阅Ævar Arnfjörð Bjarmason ( ) 的提交 1d9c8da提交 0bb92f3提交 9ab80dd提交 5c8273d(2021 年 7 月 31 日(由Junio C Hamano 合并 -- --提交 f19b275中,2021 年 8 月 24 日)avar
gitster

bundle doc: 详细说明对象的先决条件

签字人:Ævar Arnfjörð Bjarmason

将关于“对象先决条件”的讨论分成单独的部分,并添加更多常见案例的示例。

有关此处更改的文档的介绍,请参见2e0afaf(“添加 git-bundle:按存档移动对象和引用”,2007-02-22,Git v1.5.1-rc1 -- merge)。

git bundle现在在其手册页中包含:

请参阅下面的“对象先决条件”部分。

git bundle现在在其手册页中包含:

对象先决条件

创建捆绑包时,可以创建一个独立的捆绑包,可以在没有共同历史的存储库中解包,并提供负面修订以排除历史早期部分所需的对象。

馈送诸如newto之类的修订git bundle create将创建一个捆绑文件,其中包含可从该修订访问的所有对象 new。该捆绑包可以在任何存储库中展开,以获得导致修订的完整历史记录new

$ git bundle create full.bundle new

一个修订范围,例如old..new将生成一个捆绑文件,该文件将要求修订old(以及可从它访问的任何对象)存在,以使捆绑能够“解包”:

$ git bundle create full.bundle old..new

一个没有任何先决条件的独立包可以提取到任何地方,甚至可以提取到一个空的存储库中,或者从中克隆(即new,但不是old..new)。

git bundle现在在其手册页中包含:

'git bundle verify' 命令可用于检查您的收件人存储库是否具有捆绑所需的先决条件提交。

于 2021-11-01T17:10:25.143 回答