33
44虽然我们已经了解了网络传输 Git 数据的常用方法(如 HTTP,SSH 等),但还有另外一种不太常见却又十分有用的方式。
55
6- Git 可以将它的数据 ``打包'' 到一个文件中。这在许多场景中都很有用。有可能你的网络中断了,但你又希望将你的提交传给你的合作者们。可能你不在办公网中并且出于安全考虑没有给你接入内网的权限。可能你的无线、有线网卡坏掉了。可能你现在没有共享服务器的权限,你又希望通过邮件将更新发送给别人,却不希望通过 `format-patch` 的方式传输 40 个提交。
6+ Git 可以将它的数据 ``打包'' 到一个文件中。
7+ 这在许多场景中都很有用。
8+ 有可能你的网络中断了,但你又希望将你的提交传给你的合作者们。
9+ 可能你不在办公网中并且出于安全考虑没有给你接入内网的权限。
10+ 可能你的无线、有线网卡坏掉了。
11+ 可能你现在没有共享服务器的权限,你又希望通过邮件将更新发送给别人,却不希望通过 `format-patch` 的方式传输 40 个提交。
712
8- 这些情况下 `git bundle` 就会很有用。`bundle` 命令会将 `git push` 命令所传输的所有内容打包成一个二进制文件,你可以将这个文件通过邮件或者闪存传给其他人,然后解包到其他的仓库中。
13+ 这些情况下 `git bundle` 就会很有用。
14+ `bundle` 命令会将 `git push` 命令所传输的所有内容打包成一个二进制文件,你可以将这个文件通过邮件或者闪存传给其他人,然后解包到其他的仓库中。
915
10- 来看看一个简单的例子。假设你有一个包含两个提交的仓库:
16+ 来看看一个简单的例子。
17+ 假设你有一个包含两个提交的仓库:
1118
1219[source,console]
1320----
@@ -37,11 +44,14 @@ Writing objects: 100% (6/6), 441 bytes, done.
3744Total 6 (delta 0), reused 0 (delta 0)
3845----
3946
40- 然后你就会有一个名为 `repo.bundle` 的文件,该文件包含了所有重建该仓库 `master` 分支所需的数据。在使用 `bundle` 命令时,你需要列出所有你希望打包的引用或者提交的区间。如果你希望这个仓库可以在别处被克隆,你应该像例子中那样增加一个 HEAD 引用。
47+ 然后你就会有一个名为 `repo.bundle` 的文件,该文件包含了所有重建该仓库 `master` 分支所需的数据。
48+ 在使用 `bundle` 命令时,你需要列出所有你希望打包的引用或者提交的区间。
49+ 如果你希望这个仓库可以在别处被克隆,你应该像例子中那样增加一个 HEAD 引用。
4150
4251你可以将这个 `repo.bundle` 文件通过邮件或者U盘传给别人。
4352
44- 另一方面,假设别人传给你一个 `repo.bundle` 文件并希望你在这个项目上工作。你可以从这个二进制文件中克隆出一个目录,就像从一个 URL 克隆一样。
53+ 另一方面,假设别人传给你一个 `repo.bundle` 文件并希望你在这个项目上工作。
54+ 你可以从这个二进制文件中克隆出一个目录,就像从一个 URL 克隆一样。
4555
4656[source,console]
4757----
@@ -67,9 +77,14 @@ c99cf5b fourth commit - second repo
6777b1ec324 first commit
6878----
6979
70- 首先我们需要确认我们希望被打包的提交区间。和网络协议不太一样,网络协议会自动计算出所需传输的最小数据集,而我们需要手动计算。当然你可以像上面那样将整个仓库打包,但最好仅仅打包变更的部分 —— 就是我们刚刚在本地做的 3 个提交。
80+ 首先我们需要确认我们希望被打包的提交区间。
81+ 和网络协议不太一样,网络协议会自动计算出所需传输的最小数据集,而我们需要手动计算。
82+ 当然你可以像上面那样将整个仓库打包,但最好仅仅打包变更的部分 —— 就是我们刚刚在本地做的 3 个提交。
7183
72- 为了实现这个目标,你需要计算出差别。就像我们在 <<_commit_ranges>> 介绍的,你有很多种方式去指明一个提交区间。我们可以使用 `origin/master..master` 或者 `master ^origin/master` 之类的方法来获取那 3 个在我们的 master 分支而不在原始仓库中的提交。你可以用 `log` 命令来测试。
84+ 为了实现这个目标,你需要计算出差别。
85+ 就像我们在 <<_commit_ranges>> 介绍的,你有很多种方式去指明一个提交区间。
86+ 我们可以使用 `origin/master..master` 或者 `master ^origin/master` 之类的方法来获取那 3 个在我们的 master 分支而不在原始仓库中的提交。
87+ 你可以用 `log` 命令来测试。
7388
7489[source,console]
7590----
@@ -79,7 +94,8 @@ c99cf5b fourth commit - second repo
79947011d3d third commit - second repo
8095----
8196
82- 这样就获取到我们希望被打包的提交列表,让我们将这些提交打包。我们可以用 `git bundle create` 命令,加上我们想用的文件名,以及要打包的提交区间。
97+ 这样就获取到我们希望被打包的提交列表,让我们将这些提交打包。
98+ 我们可以用 `git bundle create` 命令,加上我们想用的文件名,以及要打包的提交区间。
8399
84100[source,console]
85101----
@@ -91,9 +107,11 @@ Writing objects: 100% (9/9), 775 bytes, done.
91107Total 9 (delta 0), reused 0 (delta 0)
92108----
93109
94- 现在在我们的目录下会有一个 `commits.bundle` 文件。如果我们把这个文件发送给我们的合作者,她可以将这个文件导入到原始的仓库中,即使在这期间已经有其他的工作提交到这个仓库中。
110+ 现在在我们的目录下会有一个 `commits.bundle` 文件。
111+ 如果我们把这个文件发送给我们的合作者,她可以将这个文件导入到原始的仓库中,即使在这期间已经有其他的工作提交到这个仓库中。
95112
96- 当她拿到这个包时,她可以在导入到仓库之前查看这个包里包含了什么内容。`bundle verify` 命令可以检查这个文件是否是一个合法的 Git 包,是否拥有共同的祖先来导入。
113+ 当她拿到这个包时,她可以在导入到仓库之前查看这个包里包含了什么内容。
114+ `bundle verify` 命令可以检查这个文件是否是一个合法的 Git 包,是否拥有共同的祖先来导入。
97115
98116[source,console]
99117----
@@ -114,15 +132,18 @@ error: Repository lacks these prerequisite commits:
114132error: 7011d3d8fc200abe0ad561c011c3852a4b7bbe95 third commit - second repo
115133----
116134
117- 而我们的第一个包是合法的,所以我们可以从这个包里提取出提交。如果你想查看这边包里可以导入哪些分支,同样有一个命令可以列出这些顶端:
135+ 而我们的第一个包是合法的,所以我们可以从这个包里提取出提交。
136+ 如果你想查看这边包里可以导入哪些分支,同样有一个命令可以列出这些顶端:
118137
119138[source,console]
120139----
121140$ git bundle list-heads ../commits.bundle
12214171b84daaf49abed142a373b6e5c59a22dc6560dc refs/heads/master
123142----
124143
125- `verify` 子命令同样可以告诉你有哪些顶端。该功能的目的是查看哪些是可以被拉入的,所以你可以使用 `fetch` 或者 `pull` 命令从包中导入提交。这里我们要从包中取出 `master` 分支到我们仓库中的 'other-master' 分支:
144+ `verify` 子命令同样可以告诉你有哪些顶端。
145+ 该功能的目的是查看哪些是可以被拉入的,所以你可以使用 `fetch` 或者 `pull` 命令从包中导入提交。
146+ 这里我们要从包中取出 `master` 分支到我们仓库中的 'other-master' 分支:
126147
127148[source,console]
128149----
0 commit comments