3
3
4
4
虽然我们已经了解了网络传输 Git 数据的常用方法(如 HTTP,SSH 等),但还有另外一种不太常见却又十分有用的方式。
5
5
6
- Git 可以将它的数据 ``打包'' 到一个文件中。这在许多场景中都很有用。有可能你的网络中断了,但你又希望将你的提交传给你的合作者们。可能你不在办公网中并且出于安全考虑没有给你接入内网的权限。可能你的无线、有线网卡坏掉了。可能你现在没有共享服务器的权限,你又希望通过邮件将更新发送给别人,却不希望通过 `format-patch` 的方式传输 40 个提交。
6
+ Git 可以将它的数据 ``打包'' 到一个文件中。
7
+ 这在许多场景中都很有用。
8
+ 有可能你的网络中断了,但你又希望将你的提交传给你的合作者们。
9
+ 可能你不在办公网中并且出于安全考虑没有给你接入内网的权限。
10
+ 可能你的无线、有线网卡坏掉了。
11
+ 可能你现在没有共享服务器的权限,你又希望通过邮件将更新发送给别人,却不希望通过 `format-patch` 的方式传输 40 个提交。
7
12
8
- 这些情况下 `git bundle` 就会很有用。`bundle` 命令会将 `git push` 命令所传输的所有内容打包成一个二进制文件,你可以将这个文件通过邮件或者闪存传给其他人,然后解包到其他的仓库中。
13
+ 这些情况下 `git bundle` 就会很有用。
14
+ `bundle` 命令会将 `git push` 命令所传输的所有内容打包成一个二进制文件,你可以将这个文件通过邮件或者闪存传给其他人,然后解包到其他的仓库中。
9
15
10
- 来看看一个简单的例子。假设你有一个包含两个提交的仓库:
16
+ 来看看一个简单的例子。
17
+ 假设你有一个包含两个提交的仓库:
11
18
12
19
[source,console]
13
20
----
@@ -37,11 +44,14 @@ Writing objects: 100% (6/6), 441 bytes, done.
37
44
Total 6 (delta 0), reused 0 (delta 0)
38
45
----
39
46
40
- 然后你就会有一个名为 `repo.bundle` 的文件,该文件包含了所有重建该仓库 `master` 分支所需的数据。在使用 `bundle` 命令时,你需要列出所有你希望打包的引用或者提交的区间。如果你希望这个仓库可以在别处被克隆,你应该像例子中那样增加一个 HEAD 引用。
47
+ 然后你就会有一个名为 `repo.bundle` 的文件,该文件包含了所有重建该仓库 `master` 分支所需的数据。
48
+ 在使用 `bundle` 命令时,你需要列出所有你希望打包的引用或者提交的区间。
49
+ 如果你希望这个仓库可以在别处被克隆,你应该像例子中那样增加一个 HEAD 引用。
41
50
42
51
你可以将这个 `repo.bundle` 文件通过邮件或者U盘传给别人。
43
52
44
- 另一方面,假设别人传给你一个 `repo.bundle` 文件并希望你在这个项目上工作。你可以从这个二进制文件中克隆出一个目录,就像从一个 URL 克隆一样。
53
+ 另一方面,假设别人传给你一个 `repo.bundle` 文件并希望你在这个项目上工作。
54
+ 你可以从这个二进制文件中克隆出一个目录,就像从一个 URL 克隆一样。
45
55
46
56
[source,console]
47
57
----
@@ -67,9 +77,14 @@ c99cf5b fourth commit - second repo
67
77
b1ec324 first commit
68
78
----
69
79
70
- 首先我们需要确认我们希望被打包的提交区间。和网络协议不太一样,网络协议会自动计算出所需传输的最小数据集,而我们需要手动计算。当然你可以像上面那样将整个仓库打包,但最好仅仅打包变更的部分 —— 就是我们刚刚在本地做的 3 个提交。
80
+ 首先我们需要确认我们希望被打包的提交区间。
81
+ 和网络协议不太一样,网络协议会自动计算出所需传输的最小数据集,而我们需要手动计算。
82
+ 当然你可以像上面那样将整个仓库打包,但最好仅仅打包变更的部分 —— 就是我们刚刚在本地做的 3 个提交。
71
83
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` 命令来测试。
73
88
74
89
[source,console]
75
90
----
@@ -79,7 +94,8 @@ c99cf5b fourth commit - second repo
79
94
7011d3d third commit - second repo
80
95
----
81
96
82
- 这样就获取到我们希望被打包的提交列表,让我们将这些提交打包。我们可以用 `git bundle create` 命令,加上我们想用的文件名,以及要打包的提交区间。
97
+ 这样就获取到我们希望被打包的提交列表,让我们将这些提交打包。
98
+ 我们可以用 `git bundle create` 命令,加上我们想用的文件名,以及要打包的提交区间。
83
99
84
100
[source,console]
85
101
----
@@ -91,9 +107,11 @@ Writing objects: 100% (9/9), 775 bytes, done.
91
107
Total 9 (delta 0), reused 0 (delta 0)
92
108
----
93
109
94
- 现在在我们的目录下会有一个 `commits.bundle` 文件。如果我们把这个文件发送给我们的合作者,她可以将这个文件导入到原始的仓库中,即使在这期间已经有其他的工作提交到这个仓库中。
110
+ 现在在我们的目录下会有一个 `commits.bundle` 文件。
111
+ 如果我们把这个文件发送给我们的合作者,她可以将这个文件导入到原始的仓库中,即使在这期间已经有其他的工作提交到这个仓库中。
95
112
96
- 当她拿到这个包时,她可以在导入到仓库之前查看这个包里包含了什么内容。`bundle verify` 命令可以检查这个文件是否是一个合法的 Git 包,是否拥有共同的祖先来导入。
113
+ 当她拿到这个包时,她可以在导入到仓库之前查看这个包里包含了什么内容。
114
+ `bundle verify` 命令可以检查这个文件是否是一个合法的 Git 包,是否拥有共同的祖先来导入。
97
115
98
116
[source,console]
99
117
----
@@ -114,15 +132,18 @@ error: Repository lacks these prerequisite commits:
114
132
error: 7011d3d8fc200abe0ad561c011c3852a4b7bbe95 third commit - second repo
115
133
----
116
134
117
- 而我们的第一个包是合法的,所以我们可以从这个包里提取出提交。如果你想查看这边包里可以导入哪些分支,同样有一个命令可以列出这些顶端:
135
+ 而我们的第一个包是合法的,所以我们可以从这个包里提取出提交。
136
+ 如果你想查看这边包里可以导入哪些分支,同样有一个命令可以列出这些顶端:
118
137
119
138
[source,console]
120
139
----
121
140
$ git bundle list-heads ../commits.bundle
122
141
71b84daaf49abed142a373b6e5c59a22dc6560dc refs/heads/master
123
142
----
124
143
125
- `verify` 子命令同样可以告诉你有哪些顶端。该功能的目的是查看哪些是可以被拉入的,所以你可以使用 `fetch` 或者 `pull` 命令从包中导入提交。这里我们要从包中取出 `master` 分支到我们仓库中的 'other-master' 分支:
144
+ `verify` 子命令同样可以告诉你有哪些顶端。
145
+ 该功能的目的是查看哪些是可以被拉入的,所以你可以使用 `fetch` 或者 `pull` 命令从包中导入提交。
146
+ 这里我们要从包中取出 `master` 分支到我们仓库中的 'other-master' 分支:
126
147
127
148
[source,console]
128
149
----
0 commit comments