2
2
3
3
(((libgit2)))(((C)))
4
4
另外一种可以列入考虑的方式就是使用 Libgit2 。
5
- Libgit2 是一个致力于提供一个更好的 API 去让其它程序使用的 Git 的非依赖性的工具 。
6
- 你可以在 http://libgit2.github.com[] 上找到它 。
5
+ Libgit2 是一个 Git 的非依赖性的工具,它致力于为其他程序使用 Git 提供更好的 API 。
6
+ 你可以在 http://libgit2.github.com[] 找到它 。
7
7
8
8
首先,让我们来看一下 C API 长啥样。
9
9
这是一个旋风式旅行。
@@ -30,17 +30,17 @@ git_commit_free(commit);
30
30
git_repository_free(repo);
31
31
-----
32
32
33
- 首两行打开一个 Git 版本库。
33
+ 前两行打开一个 Git 版本库。
34
34
这个 `git_repository` 类型代表了一个在内存中带有缓存的指向一个版本库的句柄。
35
35
这是最简单的方法,只是你必须知道一个版本库的工作目录或者一个 `.git` 文件夹的精确路径。
36
36
另外还有 `git_repository_open_ext` ,它包括了带选项的搜索, `git_clone` 及其同类可以用来做远程版本库的本地克隆, `git_repository_init` 则可以创建一个全新的版本库。
37
37
38
- 第二堆代码使用了一种 rev-parse 语法(要了解更多,请看 <<_branch_references>> )来得到 HEAD 真正指向的提交。
39
- 返回类型是一个 `git_object` 指针,它代表了某个存在于一个版本库中的 Git 对象数据库的东西 。
38
+ 第二段代码使用了一种 rev-parse 语法(要了解更多,请看 <<_branch_references>> )来得到 HEAD 真正指向的提交。
39
+ 返回类型是一个 `git_object` 指针,它指代位于版本库里的 Git 对象数据库中的某个东西 。
40
40
`git_object` 实际上是几种不同的对象的 ``父'' 类型,每个 `` 子'' 类型的内存布局和 `git_object` 是一样的,所以你能安全地把它们转换为正确的类型。
41
41
在上面的例子中, `git_object_type(commit)` 会返回 `GIT_OBJ_COMMIT` ,所以转换成 `git_commit` 指针是安全的。
42
42
43
- 下一堆展现了访问一个提交的详情的方法 。
43
+ 下一段展示了如何访问一个提交的详情 。
44
44
最后一行使用了 `git_oid` 类型,这是 Libgit2 表示一个 SHA-1 哈希的方法。
45
45
46
46
从这个例子中,我们可以看到一些模式:
@@ -53,8 +53,8 @@ git_repository_free(repo);
53
53
54
54
(((Ruby)))
55
55
最后一点意味着你应该不会在使用 Libgit2 时编写 C 语言程序。
56
- 但幸运的是,有许多可用的各种语言的绑定,它们可以让你更加容易地在你特定的语言和环境中操作一个 Git 版本库。
57
- 我们来看一下下面这个被叫做 Rugged 的用 Libgit2 的 Ruby 绑定写成的例子,你可以在 https://github.com/libgit2/rugged[] 看到它 。
56
+ 但幸运的是,有许多可用的各种语言的绑定,让你更加容易地在你特定的语言和环境中操作 Git 版本库。
57
+ 我们来看一下下面这个用 Libgit2 的 Ruby 绑定写成的例子,它叫 Rugged, 你可以在 https://github.com/libgit2/rugged[] 找到它 。
58
58
59
59
[source,ruby]
60
60
----
@@ -66,8 +66,8 @@ tree = commit.tree
66
66
----
67
67
68
68
你可以发现,代码看起来更加清晰了。
69
- 首先, Rugged 使用异常机制,它可以收集类似于 `ConfigError` 或者 `ObjectError` 之类的东西来告知错误的情况。
70
- 其次,不需要明确的资源释放,因为 Ruby 是垃圾回收的 。
69
+ 首先, Rugged 使用异常机制,它可以抛出类似于 `ConfigError` 或者 `ObjectError` 之类的东西来告知错误的情况。
70
+ 其次,不需要明确的资源释放,因为 Ruby 是支持垃圾回收的 。
71
71
我们来看一下一个稍微复杂一点的例子:从头开始制作一个提交。
72
72
73
73
[source,ruby]
@@ -105,8 +105,8 @@ commit = repo.lookup(commit_id) # <8>
105
105
<7> 在做一个提交的过程中, Rugged (和 Libgit2 )能在需要时更新引用。
106
106
<8> 返回值是一个新提交对象的 SHA-1 哈希,你可以用它来获得一个 `Commit` 对象。
107
107
108
- Ruby 的代码很好很简洁,另一方面因为 Libgit2 承受了重担 ,所以代码运行起来其实速度也不赖。
109
- 如果你不是一个 Ruby 程序员,我们在 <<_libgit2_bindings>> 有说到其它的一些绑定 。
108
+ Ruby 的代码很好很简洁,另一方面因为 Libgit2 做了大量工作 ,所以代码运行起来其实速度也不赖。
109
+ 如果你不是一个 Ruby 程序员,我们在 <<_libgit2_bindings>> 有提到其它的一些绑定 。
110
110
111
111
112
112
==== 高级功能
@@ -116,7 +116,7 @@ Libgit2 有几个超过核心 Git 的能力。
116
116
Libgit2 允许为自定义后端指定配置、引用的存储以及对象数据库,
117
117
118
118
我们来看一下它究竟是怎么工作的。
119
- 下面的例子借用自 Libgit2 团队提供的后端样本集 (可以在 https://github.com/libgit2/libgit2-backends[] 上看到 )。
119
+ 下面的例子借用自 Libgit2 团队提供的后端样本集 (可以在 https://github.com/libgit2/libgit2-backends[] 上找到 )。
120
120
一个对象数据库的自定义后端是这样建立的:
121
121
122
122
[source,c]
@@ -142,7 +142,7 @@ _(注意:这个错误被捕获了,但是没有被处理。我们希望你的
142
142
<4> 打开一个版本库,并让它使用我们的 ODB 来寻找对象。
143
143
144
144
但是 `git_odb_backend_mine` 是个什么东西呢?
145
- 嗯,那是一个你自己的 ODB 实现的构造器,并且你能在那里做任何你想做的事,如果你能正确地填写 `git_odb_backend` 结构的话 。
145
+ 嗯,那是一个你自己的 ODB 实现的构造器,并且你能在那里做任何你想做的事,前提是你能正确地填写 `git_odb_backend` 结构 。
146
146
它看起来_应该_是这样的:
147
147
148
148
[source,c]
@@ -177,14 +177,14 @@ int git_odb_backend_mine(git_odb_backend **backend_out, /*…*/)
177
177
其余都是随意的,这个结构的大小可以随心所欲。
178
178
179
179
这个初始化函数为该结构分配内存,设置自定义的上下文,然后填写它支持的 `parent` 结构的成员。
180
- 阅读 Libgit2 的 `include/git2/sys/odb_backend.h` 源码以了解全部调用标志,你的特定的使用情况会帮助你决定你想支持的调用标志 。
180
+ 阅读 Libgit2 的 `include/git2/sys/odb_backend.h` 源码以了解全部调用签名,你特定的使用环境会帮你决定使用哪一种调用签名 。
181
181
182
182
[[_libgit2_bindings]]
183
183
==== 其它绑定
184
184
185
185
Libgit2 有很多种语言的绑定。
186
- 在这篇文章中,我们展现了一个使用了几个更加完整的绑定包的小例子,这些库存在于许多种语言中,包括 C++, Go, Node.js, Erlang, 以及 JVM ,它们都已经处于不同程度的成熟阶段 。
187
- 官方收集的绑定可以在这个版本库中浏览得到 :https://github.com/libgit2[] 。
186
+ 在这篇文章中,我们展现了一个使用了几个更加完整的绑定包的小例子,这些库存在于许多种语言中,包括 C++, Go, Node.js, Erlang, 以及 JVM ,它们的成熟度各不相同 。
187
+ 官方的绑定集合可以通过浏览这个版本库得到 :https://github.com/libgit2[] 。
188
188
我们写的代码将返回当前 HEAD 指向的提交的提交信息(就像 `git log -1` 那样)。
189
189
190
190
@@ -205,9 +205,9 @@ new Repository(@"C:\path\to\repo").Head.Tip.Message;
205
205
===== objective-git
206
206
207
207
(((Apple)))(((Objective-C)))(((Cocoa)))
208
- 如果你的应用运行在一个 Apple 平台上,你很有可能使用 Objective-C 来作为实现它的语言 。
208
+ 如果你的应用运行在一个 Apple 平台上,你很有可能使用 Objective-C 作为实现语言 。
209
209
Objective-Git (https://github.com/libgit2/objective-git[]) 是这个环境下的 Libgit2 绑定。
210
- 一个例程看起来类似这样 :
210
+ 一个例子看起来类似这样 :
211
211
212
212
[source,objc]
213
213
-----
@@ -223,7 +223,7 @@ Objective-git 与 Swift 完美兼容,所以你把 Objective-C 落在一边的
223
223
224
224
(((Python)))
225
225
Python 的 Libgit2 绑定叫做 Pygit2 ,你可以在 http://www.pygit2.org/[] 找到它。
226
- 我们和例程 :
226
+ 我们的示例程序 :
227
227
228
228
[source,python]
229
229
----
0 commit comments