另外一种可以供你使用的是 Libgit2。 Libgit2 是一个 Git 的非依赖性的工具,它致力于为其他程序使用 Git 提供更好的 API。 你可以在 http://libgit2.github.com 找到它。首先,让我们来看一下 C API 长啥样。 这是一个旋风式旅行。// 打开一个版本库git_repository *repo;int error = git_repository_open(&repo, "/path/to/repository");
假设你的应用程序的目标人群是开发者,如果它能够被整合进一些源码控制的功能,那真真是极好的。 甚至对于一个例如文档编辑器之类的不是为开发者而设计的应用程序,它们也可能从版本控制系统中受益,并且 Git 的实现方式在很多情况下都表现得非常出色。如果你想将 Git 整合进你的应用程序的话,一般来说你有三种可能的选择:启动一个 shell 来使用 Git 的命令行工具;
你已经学会了如何从日常工具中发挥 Git 的强大力量,以及从自己的程序中访问 Git 仓库的方法。
Windows 中的普通命令行终端 (cmd.exe) 无法自定义 Git 使用体验,但是如果你正在使用 Powershell,那么你就十分幸运了。 一个名为 Posh-Git (https://github.com/dahlbyk/posh-git) 的扩展包提供了强大的 tab 补全功能, 并针对提示符进行了增强,以帮助你聚焦于你的仓库状态。 它看起来像:Figure 1-13. 附带了 Posh-Git 扩展包的 Powershell。
Git 还为 Zsh 提供了一个 Tab 补全库。 复制 contrib/completion/git-completion.zsh 到你的 home 目录,然后在 .zshrc 中 source 即可。 相对于 Bash,Zsh 的接口更加强大:$ git che<Tab>
如果你是一名 Bash 用户,你可以从中发掘出一些 Shell 的特性,让你在使用 Git 时更加随心所欲。 实际上 Git 附带了几个 Shell 的插件,但是这些插件并不是默认打开的。首先,你需要从 Git 源代码中获得一份 contrib/completion/git-completion.bash 文件的拷贝。 将这个文件复制到一个相对便捷的目录,例如你的 Home 目录,并且将它的路径添加到 .bashrc 中:.
Eclipse 附带了一个名为 Egit 的插件,它提供了一个非常完善的 Git 操作接口。 这个插件可以通过切换到 Git 视图来使用:(Window > Open Perspective > Other…, 然后选择 “Git”)。Figure 1-9. Eclipse 中 EGit 的界面环境。EGit 提供了许多强大的帮助文档,你能通过下面的操作来访问它:单击菜单 Help >
从 Visual Studio 2013 Update 1 版本开始,Visual Studio 用户可以在他们的 IDE 中直接使用内嵌的 Git 客户端。 Visual Studio 集成源代码版本控制特性已经有很长一段时间,但面向的是集中式、文件锁定方式的系统,Git 并不能很好地符合这种工作流程。 Visual Studio 2013 中已经支持 Git,并独立于原有版本管理系统,这使得 Visual Studio 和 Git 能更好地相互适应。
从头至尾读到了这里,你肯定已经掌握了不少使用 Git 命令行操作的知识。 你学会了操作本地文件,通过网络连接你的仓库,以及与他人进行有效率的合作。 但是故事并未就此结束;Git 通常只是更大的生态圈的一部分,在某些情况下使用终端并不是最合适的方式。 现在就让我们来了解一下如何在其它类型的环境中更好地使用 Git,以及别的应用(包括你的)如何与 Git 进行协作。
现在,你应该相当了解 Git 在背后都做了些什么工作,并且在一定程度上也知道了 Git 是如何实现的。 本章讨论了很多底层命令,这些命令比我们在本书其余部分学到的高层命令来得更原始,也更简洁。 从底层了解 Git 的工作原理有助于更好地理解 Git 在内部是如何运作的,也方便你能够针对特定的工作流写出自己的工具和脚本。
Git 总是在一个 bash shell 中运行,并借助一些 shell 环境变量来决定它的运行方式。 有时候,知道它们是什么以及它们如何让 Git 按照你想要的方式去运行会很有用。 这里不会列出所有的 Git 环境变量,但我们会涉及最有的那部分。全局行为像通常的程序一样,Git 的常规行为依赖于环境变量。GIT_EXEC_PATH 决定 Git 到哪找它的子程序 (像 git-commit, git-diff 等等)。
有的时候,你需要对仓库进行清理 - 使它的结构变得更紧凑,或是对导入的仓库进行清理,或是恢复丢失的内容。 这个小节将会介绍这些情况中的一部分。维护Git 会不定时地自动运行一个叫做 “auto gc” 的命令。 大多数时候,这个命令并不会产生效果。 然而,如果有太多松散对象(不在包文件中的对象)或者太多包文件,Git 会运行一个完整的 git gc 命令。
Git 可以通过两种主要的方式在版本库之间传输数据:“哑(dumb)”协议和“智能(smart)”协议。 本节将会带你快速浏览这两种协议的运作方式。哑协议如果你正在架设一个基于 HTTP 协议的只读版本库,一般而言这种情况下使用的就是哑协议。 这个协议之所以被称为“哑”协议,是因为在传输过程中,服务端不需要有针对 Git 特有的代码;
纵观全书,我们已经使用过一些诸如远程分支到本地引用的简单映射方式,但这种映射可以更复杂。 假设你添加了这样一个远程版本库:$ git remote add origin https://github.com/schacon/simplegit-progit上述命令会在你的 .
让我们重新回到示例 Git 版本库的对象数据库。 目前为止,可以看到有 11 个对象——4 个数据对象、3 个树对象、3 个提交对象和 1 个标签对象:$ find .git/objects -type f.git/objects/01/55eb4229851634a0f03eb265b69f5a2d56f341 # tree 2.git/objects/1a/410efbd13591db07496601ebc7a059dd55cfe9 # commit 3.
我们可以借助类似于 git log 1a410e 这样的命令来浏览完整的提交历史,但为了能遍历那段历史从而找到所有相关对象,你仍须记住 1a410e 是最后一个提交。 我们需要一个文件来保存 SHA-1 值,并给文件起一个简单的名字,然后用这个名字指针来替代原始的 SHA-1 值。在 Git 里,这样的文件被称为“引用(references,或缩写为 refs)”;你可以在 .
Git 是一个内容寻址文件系统。 看起来很酷, 但这是什么意思呢? 这意味着,Git 的核心部分是一个简单的键值对数据库(key-value data store)。 你可以向该数据库插入任意类型的内容,它会返回一个键值,通过该键值可以在任意时刻再次检索(retrieve)该内容。 可以通过底层命令 hash-object 来演示上述效果——该命令可将任意数据保存于 .git 目录,并返回相应的键值。
无论是从之前的章节直接跳到本章,还是读完了其余章节一直到这——你都将在本章见识到 Git 的内部工作原理和实现方式。 我们发现学习这部分内容对于理解 Git 的用途和强大至关重要。不过也有人认为这些内容对于初学者而言可能难以理解且过于复杂。 因此我们把这部分内容放在最后一章,在学习过程中可以先阅读这部分,也可以晚点阅读这部分,这取决于你自己。
你会觉得将 Git 作为其他版本控制系统的客户端,或者在数据无损的情况下将几乎任何一个现有的仓库导入到 Git,都是一件很惬意的事。 在下一章,我们将要讲解 Git 的原始内部数据,如果需要的话你就可以加工每一个字节。
如果你现在有一个正在使用其他 VCS 的代码库,但是你已经决定开始使用 Git,必须通过某种方式将你的项目迁移至 Git。 这一部分会介绍一些通用系统的导入器,然后演示如何开发你自己定制的导入器。 你将会学习如何从几个大型专业应用的 SCM 系统中导入数据,不仅因为它们是大多数想要转换的用户正在使用的系统,也因为获取针对它们的高质量工具很容易。
关注时代Java