使用 git post-receive 钩子部署服务端代码

在 git 中提交服务器源码的时候,如果能够直接更新到测试服务器,并且重启服务使其生效,会节省懒惰的程序员们大量的时间。

git 的 Server-side hook (服务端钩子/挂钩)可以用来做件事。

本文以部署基于 OpenResty 的服务端程序为例来介绍我的做法。

技术信息

  • OS: CentOS 6.3
  • 服务器软件: OpenResty
  • 开发语言: Lua

名词解释

  • 服务器: 服务器硬件 + OS
  • 服务端程序: OpenResty 在服务器中的进程
  • 服务端代码: 部署在 OpenResty 中的 Lua 源程序

一、git 服务端钩子类型

Pro git 中介绍了 git 钩子的几种类型,其中和服务端相关的有: 继续阅读使用 git post-receive 钩子部署服务端代码

管理带有子模块的git库(以 DragonBonesCPP 为例)

2015-09-06 更新: 加入 删除子模块 的内容。


DragonBonesCPP 是一个包含子模块的库,在 clone/commit/push 的时候需要一些额外的操作。

本文将描述这些操作。

子模块(submodule)

限(wei)于(le)篇(tou)幅(lan),请自行学习下面的内容:

clone DragonBonesCPP

蛋碎方法一

git clone --recursive git@github.com:DragonBones/DragonBonesCPP.git

使用这个方法,将会自动 clone 该项目下的所有子模块。这其实是最简单的方法了。

为什么说它令人蛋碎呢?因为 DragoneBones 中包含的 engines/cocos2d-x 子模块也包含子模块。

这样就出现了嵌套子模块,一个 cocos2d-x 的所有历史加起来就超过1G了,再加上子模块的所有历史,这就……。 继续阅读管理带有子模块的git库(以 DragonBonesCPP 为例)

解决Github访问超慢问题

解决Github访问超慢问题

Github is so slowly.

这段时间访问 github 都非常慢,google了一下发现是github某个CDN被伟大的墙屏蔽所致。

出问题的应该是这个CDN: github.global.ssl.fastly.net,有图为证:

CDN访问不畅

解决方法就是使用万能的host文件,将这个域名映射到它所在的ip。

  1. 访问 IPAddress.com 使用 IP Lookup 工具获得这个域名的ip地址(注意,该网站可能需要梯子);
  2. 也可以直接点击 这个地址 查看,结果如下:
    http://github.global.ssl.fastly.net.ipaddress.com/#ipinfo
  3. 撰写本文时,该ip地址为:185.31.17.185 ;
  4. 修改host文件;
  5. 刷新本机DNS缓存。

参考文章:

cygwin在windows8.1上的chmod无法修改权限

cygwin在windows8.1上的chmod无法修改权限

这几天安装了windows 8.1,在使用cygwin的时候发现了问题。

表现

在使用git clone一个项目时,cygwin告知 .ssh 的权限不正常:

$ git clone git@github.com:zrong/cocos2d-x-filters.git
Cloning into 'cocos2d-x-filters'...
Bad owner or permissions on /home/rong/.ssh/config
fatal: Could not read from remote repository.

Please make sure you have the correct access rights

查看一下权限,是这样的: 继续阅读cygwin在windows8.1上的chmod无法修改权限

git svn dcommit 提交失败,原因:assertion “svn_fspath__is_canonical(child_fspath)” faile

git svn dcommit 提交失败,原因:assertion “svn_fspath__is_canonical(child_fspath)” failed

在使用 git svn 作为客户端对一个 svn 库进行提交的时候出现了错误:

git svn dcommit
Committing to https://xx.xx.xx.xx/svn/xyz/trunk …
R CODING_STYLE.md => doc/CODING_STYLE.md
assertion “svn_fspathis_canonical(child_fspath)” failed: file “/usr/src/packages/subversion/subversion-1.8.5-1/src/subversion-1.8.5/subversion/libsvn_subr/dirent_uri.c”, line 2504, function: svn_fspathskip_ancestor
error: git-svn died of signal 6

错误发生在 cygwin 下,git 版本 1.7.9,svn 版本 1.8.5。

stackoverflow 上说,原因是 git 的重命名检测机制与 svn 发生了冲突。有两个解决方案:

  1. 把 svn 降级到 1.7.9,一劳永逸。
  2. 使用 git svn dcommit -C1 -l1 来提交。这样会关闭 git 的重命名检测机制,这次提交会丢失重命名操作,取而代之的是一次 remove 和 一次 add 操作,就和 svn 1.4 一样。

在Cygwin中编译Git

在Cygwin中编译Git

概述

我一直在Cygwin中以命令行的方式使用git。但是Cygwin源中的git版本比较老(v1.7.9),而自 1.7.10以来,git增加了许多新的特性,尤其是对中文用户特别有用的 使用UTF-8编码保存文件名 等等。为了使用这些新特性,我们只能自己编译Git。

如果希望了解我上面说的“对中文用户特别有用的特性”,可以看这篇文章:git乱码解决方案汇总

下载源码

在这里下载最新的Git源码,我下载的是 v1.8.1.4:

http://code.google.com/p/git-core/downloads/list

解压缩源码和手册: 继续阅读在Cygwin中编译Git

使用bash从SVN和Git中获取顺序版本号

使用bash从SVN和Git中获取顺序版本号

在进行自动部署的时候,经常需要用脚本获取程序的最新版本号,下面是我的两个解决方案。

for SVN

# 获取XML版本的svn信息,这样可以避免不同语言的问题
xml=`svn info --xml --incremental`
# 我们可以获取到2个版本号,一个是最新版本库版本号,一个是自己的提交版本号。删除自己提交的版本号。
revision=`echo "$xml"|sed '/revision/!d'|sed '$d'`
# 提取出版本号的数字部分
echo $revision|sed 's/revision="\([0-9]\+\)">\?/\1/'

for Git

Git采用的是SHA散列码作为版本号,因此它没有顺序的版本号。但我们可以通过统计Git版本库的提交次数来获得一个顺序版本号。

# 基准版本号默认是1,可以通过传递一个参数修改
get_version()
{
    local base=${1:-1}
    echo $((`git rev-list --all|wc -l` + $base))
}
get_version 7000

这个版本对网上搜到的那个被普遍转载的版本做了简化和调整。网上那个版本写得比较复杂,例如awk的使用没有必要,而且要统计所有提交,应该用 git rev-list --all 参数,而不是用 git rev-list HEAD

在TortoiseGit中使用SSH host

在TortoiseGit中使用SSH host

2012-12-30更新:修改由于理解错误造成的描述错误


git命令行与OpenSSH

在OpenSSH中,我们可以很方便的通过编辑 ~/.ssh/config 文件来为git指定不同的host,达到使用不同的端口,不同的密钥访问git服务的目的。看看下面这个例子:

192.168.18.18 这台服务器的SSH服务器使用2012端口,我可以使用 git clone git@server18:myrepo.git 来获取我的版本库;
我在bitbucket上有两个帐号 testrelease,需要使用不同的密钥。我可以使用 git clone bitbucket_test:myrepo.gitgit clone bitbucket_release:myrepo.git 来获取。

host server18
    HostName 192.168.18.18
    port 2012
    IdentityFile ~/.ssh/server18

host bitbucket_test
    HostName bitbucket.org
    port 22
    User git
    IdentityFile ~/.ssh/bitbucket_test

host bitbucket_release
    HostName bitbucket.org
    port 22
    User git
    IdentityFile ~/.ssh/bitbucket_release

TortoiseGit与PuTTY

TortoiseGit怎么办?

在安装TortoiseGit的时候,可以选择使用OpenSSH客户端还是使用Putty客户端。如果使用的是Putty客户端,那么上面的设置不会起作用,我们必须在PuTTY中进行类似的设置。步骤如下:

  1. TortoiseGit并没有自带PuTTY客户端,你需要先去下载一个
  2. Session 界面,设置 Host NamePort
    Session
  3. Connect->SSH->Auth 界面,设置 Private Key
    Private Key
  4. 回到 Session 界面,保存 Session。

有了 Session 之后,就可以在TortoiseGit中将这个 Session Name 作为服务器URL连接,如下图:

tortoiseGit setting

我没有找到办法在 Session 设置中找到设置用户名的地方,因此如果Tortoise出现这样的提示:

login name

只需要把URL设置成 git@server18:sg/binary 即可。

参考文章

Git查看、删除、重命名远程分支和tag

Git查看、删除、重命名远程分支和tag

  • 2015-06-15:加入姊妹篇;
  • 2013-11-06:加入重命名远程分支的内容;
  • 2013-01-09:加入删除远程tag的内容。

姊妹篇:使用Git、Git GUI和TortoiseGit


这篇文章记录我在使用git的过程中碰到远程分支和tag的相关内容,提纲:

  1. 查看远程分支
  2. 删除远程分支和tag
  3. 删除不存在对应远程分支的本地分支
  4. 重命名远程分支
  5. 把本地tag推送到远程
  6. 获取远程tag

查看远程分支

加上-a参数可以查看远程分支,远程分支会用红色表示出来(如果你开了颜色支持的话):

$ git branch -a
  master
  remote
  tungway
  v1.52
* zrong
  remotes/origin/master
  remotes/origin/tungway
  remotes/origin/v1.52
  remotes/origin/zrong

删除远程分支和tag

在Git v1.7.0 之后,可以使用这种语法删除远程分支:

$ git push origin --delete <branchName>

删除tag这么用:

git push origin --delete tag <tagname>

继续阅读Git查看、删除、重命名远程分支和tag

使用Git、Git GUI和TortoiseGit

使用Git、Git GUI和TortoiseGit

Using git, git gui and tortoisegit

  • 2015-06-15更新:加入姊妹篇
  • 2015-01-28更新:Mac OS X 的 GUI 工具选择
  • 2013-11-05更新:加入从 putty 切换到 OpenSSH
  • 2012-12-30更新:在安装的时候选择TortoiseGit使用的SSH客户端
  • 2012-12-26更新:在TortoiseGit中使用SSH host

注意: 本文不讲解任何关于Git提交、合并等等使用细节和语法,只记录作者在使用Git相关工具中碰到的问题和选择的经验。本文只是个人意见的集中,不代表适合所有人。如果你是 “被惯坏了的那批”,请不要介意。:-)


姊妹篇:Git查看、删除、重命名远程分支和tag


1. 关于命令行

我一直建议在命令行中使用Git或者SVN。因为这样可能更加了解他们的工作方式,也不容易遗漏重要的问题和提醒。

在Windows习惯的驱使下,大多数人是不会看弹出的对话框中有什么信息的,一般都是直接关掉。但是,版本库给我们的提示信息都是非常重要的,有的是冲突,有的是提交失败,等等,这些都被略过了。

我碰到的关于版本库使用问题主要包括下面这些: 继续阅读使用Git、Git GUI和TortoiseGit