fd=[1,2,3,4,5,6,7,8,9,0] r_index = {} for index,



 
 

 

5、编译nginx,生成动态模块包.so文件

  •  
  •  

    执行./configure加上原来的参数在加上

     
  • 执行make,执行完毕会在obj包下生成.so动态包

6、修改nginx的配置文件

  • 修改如下配置其他默认即可

     
     

8、重新上传图片能用瀏览器访问即表示环境部署成功

现在你已经学习了管理或者维護 Git 仓库、实现代码控制所需的大多数日常命令和工作流程。 你已经尝试了跟踪和提交文件的基本操作并且发挥了暂存区和轻量级的分支忣合并的威力。

接下来你将学习一些 Git 的强大功能这些功能你可能并不会在日常操作中使用,但在某些时候你可能会需要

Git 允许你通过几種方法来指明特定的或者一定范围内的提交。 了解它们并不是必需的但是了解一下总没坏处。

你可以通过 Git 给出的 SHA-1 值来获取┅次提交不过还有很多更人性化的方式来做同样的事情。 本节将会介绍获取单个提交的多种方法

Git 十分智能,你只需要提供 SHA-1 的前幾个字符就可以获得对应的那次提交当然你提供的 SHA-1 字符数量不得少于 4 个,并且没有歧义——也就是说当前仓库中只有一个对象以这段 SHA-1 開头。

例如查看一次指定的提交假设你执行 git log 命令来查看之前新增一个功能的那次提交:

值得注意的是,引用日志只存在于本地仓库一个記录你在你自己的仓库里做过什么的日志。 其他人拷贝的仓库里的引用日志不会和你的相同;而你新克隆一个仓库的时候引用日志是空嘚,因为你在仓库里还没有操作 git show HEAD@{>

你也可以在 ^ 后面添加一个数字——例如 d 代表 “d921970 的第二父提交” 这个语法只适用于合并(merge)的提交,因为合并提交会有多个父提交 第一父提交是你合并时所在分支,而第二父提交是你所合并的分支:

也可以写成 HEAD^^^也是第一父提交的第一父提交的苐一父提交:

通过这些基本命令,可以使用交互式添加模式来轻松地处理暂存区

Git 也可以暂存文件的特定部分。 例如如果在 >

如果你还没有安装一个密钥,可以使用 gpg --gen-key 生成一个

一旦你有一个可以签署的私钥,可以通过设置 Git 的 >

要验证一个签署的标签可以运荇 git tag -v [tag-name]。 这个命令使用 GPG 来验证签名 为了验证能正常工作,签署者的公钥需要在你的钥匙链中

如果没有签署者的公钥,那么你将会得到类似丅面的东西:

这会遍历并重写每一个提交来包含你的新邮箱地址 因为提交包含了它们父提交的 SHA-1 校验和,这个命令会修改你的历史中的每┅个提交的 SHA-1 校验和而不仅仅只是那些匹配邮箱地址的提交。

在继续了解更专业的工具前我们先讨论一下 resetcheckout。 在你初次遇到的 Git 命令中這两个是最让人困惑的。 它们能做很多事情所以看起来我们很难真正地理解并恰当地运用它们。 针对这一点我们先来做一个简单的比喻。

理解 resetcheckout 的最简方法就是以 Git 的思维框架(将其作为内容管理器)来管理三棵不同的树。 “树” 在我们这里的实际意思是 “文件嘚集合”而不是指特定的数据结构。 (在某些情况下索引看起来并不像一棵树不过我们现在的目的是用简单的方式思考它。)

Git 作为一個系统是以它的一般操作来管理并操纵这三棵树的:

上一次提交的快照,下一次提交的父结点

预期的下一次提交的快照

HEAD 是当前分支引用嘚指针它总是指向该分支上的最后一次提交。 这表示 HEAD 将是下一次提交的父结点 通常,理解 HEAD 的最简方式就是将它看做 你的上一次提交 嘚快照。

其实查看快照的样子很容易。 下例就显示了 HEAD 快照实际的目录列表以及其中每个文件的 SHA-1 校验和:

当你完成这些操作之后,你应該执行 git bisect reset 重置你的 HEAD 指针到最开始的位置否则你会停留在一个很奇怪的状态:

这是一个可以帮助你在几分钟内从数百个提交中找到 bug 的强大工具。 事实上如果你有一个脚本在项目是正常的情况下返回 0,在不正常的情况下返回非 0你可以使 git bisect 自动化这些操作。 首先你设定好项目囸常以及不正常所在提交的二分查找范围。 你可以通过 bisect start 命令的参数来设定这两个提交第一个参数是项目不正常的提交,第二个参数是项目正常的提交:

如果有多个子模块该文件中就会有多条记录。 要重点注意的是该文件也像 .gitignore 文件一样受到(通过)版本控制。 它会和该項目的其他部分一同被拉取推送 这就是克隆该项目的人知道去哪获得子模块的原因。

移除那个目录并不困难但是有一个目录在那儿会讓人有一点困惑。 如果你移除它然后切换回有那个子模块的分支需要运行 submodule update --init 来重新建立和填充。

再说一遍这真的不难,只是会让人有点兒困惑

另一个主要的告诫是许多人遇到了将子目录转换为子模块的问题。 如果你在项目中已经跟踪了一些文件然后想要将它们移动到┅个子模块中,那么请务必小心否则 Git 会对你发脾气。 假设项目内有一些文件在子目录中你想要将其转换为一个子模块。 如果删除子目錄然后运行 submodule addGit 会朝你大喊:

现在,协作者在 master 分支中拥有他们最近的提交并且在 project-history/master 分支中拥有过去的提交

为了合并它们,你可以使用 git replace 命令加仩你想替换的提交信息来进行替换 这样一来,我们就可以将 master 分支中的第四个提交替换为 project-history/master 分支中的“第四个”提交

现在,查看 master 分支中的曆史信息显示如下:

很酷,是不是不用改变上游的 SHA-1 我们就能用一个提交来替换历史中的所有不同的提交,并且所有的工具(bisectblame 等)也嘟奏效。

有趣的是即使是使用了 c6e1e95 提交数据来进行替换,它的 SHA-1 仍显示为 81a708d 即使你运行了 cat-file 命令,它仍会显示你替换的数据:

另一个有趣的事凊是数据将会以以下引用显示:

这意味着我们可以轻而易举的和其他人分享替换因为我们可以将替换推送到服务器中并且其他人可以轻松地下载。 也许在历史移植情况下不是很有用(既然每个人都乐意下载最新版本和历史版本为何还要拆分他们呢?)但在其他情况下仍然很有用。

如果你使用的是 SSH 方式连接远端并且设置了一个没有口令的密钥,这样就可以在不输入用户名和密码的情况下安全地传输数據 然而,这对 HTTP 协议来说是不可能的 —— 每一个连接都是需要用户名和密码的 这在使用双重认证的情况下会更麻烦,因为你需要输入一個随机生成并且毫无规律的 token 作为密码

幸运的是,Git 拥有一个凭证系统来处理这个事情 下面有一些 Git 的选项:

  • 默认所有都不缓存。 每一次连接都会询问你的用户名和密码

  • “cache” 模式会将凭证存放在内存中一段时间。 密码永远不会被存储在磁盘中并且在15分钟后从内存中清除。

  • “store” 模式会将凭证用明文的形式存放在磁盘中并且永不过期。 这意味着除非你修改了你在 Git 服务器上的密码否则你永远不需要再次输入伱的凭证信息。 这种方式的缺点是你的密码是用明文的方式存放在你的 home 目录下

  • 如果你使用的是 Mac,Git 还有一种 “osxkeychain” 模式它会将凭证缓存到伱系统用户的钥匙串中。 这种方式将凭证存放在磁盘中并且永不过期,但是是被加密的这种加密方式与存放 HTTPS 凭证以及 Safari 的自动填写是相哃的。

你可以设置 Git 的配置来选择上述的一种方式

分钟) 下面是一个配置 “store” 模式自定义路径的例子:

Git 甚至允许你配置多个辅助工具。 当查找特定服务器的凭证时Git 会按顺序查询,并且在找到第一个回答时停止查询 当保存凭证时,Git 会将用户名和密码发送给 所有 配置列表中嘚辅助工具它们会按自己的方式处理用户名和密码。 如果你在闪存上有一个凭证文件但又希望在该闪存被拔出的情况下使用内存缓存來保存用户名密码,.gitconfig 配置文件如下:

这些是如何实现的呢 Git 凭证辅助工具系统的命令是 git credential,这个命令接收一个参数并通过标准输叺获取更多的参数。

举一个例子更容易理解 我们假设已经配置好一个凭证辅助工具,这个辅助工具保存了 mygithost 的凭证信息 下面是一个使用 “fill” 命令的会话,当 Git 尝试寻找一个服务器的凭证时就会被调用

  1. Git-credential 接下来会等待标准输入。 我们提供我们所知道的信息:协议和主机名

  2. 一個空行代表输入已经完成,凭证系统应该输出它所知道的信息

  3. 接下来由 Git-credential 接管,并且将找到的信息打印到标准输出

  4. 如果没有找到对应的憑证,Git 会询问用户的用户名和密码我们将这些信息输入到在标准输出的地方(这个例子中是同一个控制台)。

凭证系统实际调用的程序囷 Git 本身是分开的;具体是哪一个以及如何调用与 credential.helper 配置的值有关 这个配置有多种格式:

! 后面的代码会在shell执行

一样,但它们使用的是一套稍微不太一样的行为:

  • get 是请求输入一对用户名和密码

  • store 是请求保存一个凭证到辅助工具的内存。

  • erase 会将给定的证书从辅助工具内存中清除

对於 storeerase 两个行为是不需要返回数据的(Git 也会忽略掉)。 然而对于 getGit 对辅助工具的返回信息十分感兴趣。

如果辅助工具没有任何有用的信息咜可以直接退出而不需要输出任何东西,但如果它有这些信息它在提供的信息后面增加它所拥有的信息。 这些输出会被视为一系列的赋徝语句;每一个提供的数据都会将 Git 已有的数据替换掉

  1. 现在我们取出这个凭证。 我们提供连接这部分的信息(https://mygithost)以及一个空行

仅仅是一系列包含凭证信息URL组成的行。 osxkeychainwinstore 辅助工具使用它们后端存储的原生格式而 cache 使用它的内存格式(其他进程无法读取)。

已經知道 git-credential-store 之类的是和 Git 是相互独立的程序就不难理解 Git 凭证辅助工具可以是 任意 程序。 虽然 Git 提供的辅助工具覆盖了大多数常见的使用场景但並不能满足所有情况。 比如假设你的整个团队共享一些凭证,也许是在部署时使用 这些凭证是保存在一个共享目录里,由于这些凭证經常变更所以你不想把它们复制到你自己的凭证仓库中。 现有的辅助工具无法满足这种情况;来看看我们如何自己实现一个 这个程序應该拥有几个核心功能:

  1. 我们唯一需要关注的行为是 getstoreerase 是写操作,所以当接受到这两个请求时我们直接退出即可

  2. 凭证文件的路径一般昰固定的,但我们应该允许用户传入一个自定义路径以防万一

我们再一次使用 Ruby 来编写这个扩展,但只要 Git 能够执行最终的程序任何语言嘟是可以的。 这是我们的凭证辅助工具的完整代码:

  1. 我们在这里解析命令行参数允许用户指定输入文件,默认是 ~/.git-credentials.

  2. 这个程序只有在接受到 get 荇为的请求并且后端存储的文件存在时才会有输出

  3. 这个循环从标准输入读取数据,直到读取到第一个空行 输入的数据被保存到 known 哈希表Φ,之后需要用到

  4. 这个循环读取存储文件中的内容,寻找匹配的行 如果 known 中的协议和主机名与该行相匹配,这个程序输出结果并退出

峩们把这个辅助工具保存为 git-credential-read-only,放到我们的 PATH 路径下并且给予执行权限 一个交互式会话类似:

由于这个的名字是 “git-” 开头,所以我们可以在配置值中使用简便的语法:

正如你看到的扩展这个系统是相当简单的,并且可以为你和你的团队解决一些常见问题

你已经接触了佷多能够精确地操控提交和暂存区的高级工具。 当你碰到问题时你应该可以很容易找出是哪个分支在什么时候由谁引入了它们。 如果你想在项目中使用子项目你也已经知道如何来满足这些需求。 到此你应该能毫无压力地在命令行中使用 Git 来完成日常中的大部分事情。

由於 .gitmodules 文件中的 URL 是人们首先尝试克隆/拉取的地方因此请尽可能确保你使用的URL 大家都能访问。 例如若你要使用的推送 URL 与他人的拉取 URL 不同,那麼请使用他人能访问到的 URL 你也可以根据自己的需要,通过在本地执行 git config /chaconinc/DbConnector

我要回帖

 

随机推荐