OSX: Finder 和 Terminal 的切换

在 Finder 打开 Terminal 并切换到当前目录

安装一个开源的 Finder 辅助工具:cdto。功能只有一个就是实现在 Finder 打开 Terminal 并切换到当前 Finder 目录。找到你系统的版本的 app (支持当前 OS X 10.4 以上版本,应该都是雪豹了 吧)拷贝到 Applications 下并把它拖到 Finder 的工具栏上即可。

从 Terminal 中用 Finder 打开当前路径的目录

open .

PS,如果是 Ubuntu 系统的话请安装 nautilus,然后在 Terminal 里面输入

nautilus .

Ubuntu 解决 public key is not available 问题

自 Ubuntu 10.04 升级至 10.10 之后,系统就有些不注意的小毛病,包括系统的各个软件的配置文件可能有改动, 加上常年累计尝试并添加很多 ppa
的源,自定义的软件源在升级兼容的考虑下全部金禁用了导致原本软件源的注解名称也没有了,自己不知道各个软件源是干什么的…于是手动在软件源管理(10.10 a本放在了 Applications -> Ubuntu Software Center 程序里面 Edit 菜单下面)清理。

第一开始是凭记忆清理了一部分不再使用的软件的源,退出后更新发现失败…再次清理 Authentication 里面的 Public key,发现还是有问题,最后下定狠心把所有的源和 public key 全部删除了再更新发现还是有错误 T_T 其实错误提示的是一种类型的:

W: GPG error: http://ppa.launchpad.net jaunty Release: The following signatures couldn’t be verified because the public key is not available: NO_PUBKEY 12DE1BCB04E5E17B5

自己动手丰衣足食…Google 之发现有两种解决方案,第一个是在 launchpad keyserver 网站搜索 key 从而找到 public key,详情请看这里。第二种则相对于比较简单:命令行流。

1. 复制报错的尾部 NO_PUBKEY 后面的串的后 8 位(以上面的为例:4E5E17B5),执行:

$ gpg --keyserver keyserver.ubuntu.com --recv 4E5E17B5

# 返回信息
gpg: requesting key 4E5E17B5 from hkp server keyserver.ubuntu.com
gpg: key 4E5E17B5: public key "Launchpad PPA for chromium-daily" imported
gpg: no ultimately trusted keys found
gpg: Total number processed: 1
gpg:               imported: 1  (RSA: 1)
$ gpg --export --armor 4E5E17B5 | sudo apt-key add -

# 返回信息
OK

解决!

水果属性概述

热性水果:适合寒性体质
榴连、黑枣

温性水果:适合寒性体质
芒果、荔枝、桃子、龙眼、红毛丹、水蜜桃、板栗、释迦、椰子肉、金桔、乌梅、樱桃、红枣、
李子(微温)

平性水果:适合各种体质
百香果、柠檬、番石榴、酪梨、凤梨、葡萄、莲雾、柳橙、甘蔗、木瓜、橄榄、梅子、印度枣

凉性水果:适合热性体质
火龙果、梨、苹果、杨桃、山竹、葡萄柚、草莓、枇杷

寒性水果:适合热性体质
蕃茄(微寒)、西瓜、香蕉、奇异果、甜瓜、柚子、橘子、柿子、椰子水、桑椹

使用 Git Hooks 实现自动项目部署

最近在某服务器上面搭建 git 开发和部署环境,git 开发环境很简单,按照 ProGit 一书的相关知识就可以轻松搞定,实现了类似 Github 的使用 SSH + 私有 Clone 的方式。

关于部署,奇迹上是自动部署,起初的想法是使用 bash shell 制定一个定时任务去不断 git pull 产品代码,后来记得 Git 带有 Hooks,索性在 ProGit 一书翻了翻:

Git 本身可以调用自定义的挂钩脚本,其中有两组:客户端和服务器端。客户端挂钩用于客户端的操作,如提交和合并。服务器端挂钩用于 Git 服务器端的操作,如接收被推送的提交。详情请查看 ProGit 相关章节

如果这样就简单了,利用服务器端调用想要的挂钩(Hook),即可实现自动部署的方案,为了保证不被肆意部署,特加了一个对需要部署 commit 的判断,利用读取 commit subject 并匹配想要的字符串才去部署,这样我认为是一个比较安装的部署方案。

Git的挂钩(Hook)主要包含:

  • applypatch-msg
  • post-update
  • pre-rebase
  • commit-msg
  • pre-applypatch
  • update
  • post-commit
  • pre-commit
  • post-receive
  • prepare-commit-msg

这里我们只需要使用 post-receive 这个 Hook:在接收 post(push) 请求之后执行。其他大部分我也没有大多研究,不过看名字不算难理解,我觉得其中大部分包含 commit 的属于客户端。

好了,部署开始:

1. 在服务器 git 仓库(注意是 bare 仓库,不是代码仓库)的 Hooks,编辑 post-receive(如果没有自行创建),贴入下面代码(Feed 用户请看这里):

这里会先判断脚本所在目录是否是 bare git 仓库,然后获取最新 commit 的 subject,并匹配是否包含 [deploy] 字样,如果包含,则继续检查产品代码仓库路径是否存在,如果存在则执行 git pull 操作。

2. 对刚才编辑的 post-receive 执行下面命令以保证脚本可执行:

$ chmod +x post-receive

3. 完成!

————————————-

对于自定义脚本,其实不仅限于 bash shell,你可以使用你熟悉的语言,然后把你的脚本路径在 hooks 脚本中加载即可。

脚本还会继续更新,下面需要增加关于测试部分的相关判断和部署。 bash shell 还需要进一步学习,上面脚本是我第一次写,如有不妥之处,请指教,感谢!

如何保持在 Git Submodule 代码的开放和私有共存

假设我在 github 有一个开源的版本库 x 供大家使用,该库里面又包含了好些个 submodules,其中有一个 submodule 名为 a 是自己在 github 又创建的:

$ git submodule add  http://github.com/icyleaf/a.git modules/a

现在问题是,由于代码需要更新,同时涉及到了 a 这个 submodule,但是它的添加 url 是 read-only,由于 x 这个库是供大家使用,因此 a 又不能设为 private:

$ git clone git@github.com:icyleaf/a.git modules/a

目前想到的方法是在 x 库以外 clone 下来 a,进行私有的写入和 push 到 github 上面,然后在 x 库的 a 里 git pull 下来获得最新的代码。

如何解决这样的问题,能够当大家全部 clone 下来,而自己开发也能避免麻烦?

在一篇文章上面找到了灵感,折腾了一番搞定了

该文章有一节讲到,开发者如果经常需要更新 submodule ,即可更换 submodule 的 remote url:

$ cd commonlib
$ git remote rm origin
$ git remote add origin ssh://mark@git.mysociety.org/data/git/public/commonlib.git
$ git remote -v
origin    ssh://mark@git.mysociety.org/data/git/public/commonlib.git

However, you’ll find that two helpful config options will have been deleted when removing and adding back origin, so you’ll want to add these back.

$ git config branch.master.remote origin
$ git config branch.master.merge refs/heads/master

首先我也先对 a 进行 git remote -v,结果显示:

origin	http://github.com/icyleaf/a.git (fetch)
origin	http://github.com/icyleaf/a.git (push)

发现和文章里面的显示的结果不一样,于是我就在想能不能在 remote 上面做些手脚,首先看下 git remote 的 help,发现有一条是可以单独设置 remote push 的 url ,也就是更换上面 git remote -v 中 push 的 url,尝试:

$ git remote set-url --push origin git@github.com:icyleaf/a.git

再次执行 remote -v:

origin	http://github.com/icyleaf/a.git (fetch)
origin	git@github.com:icyleaf/a.git (push)

执行成功!然后随意 commit 并 push orgin master,成功!

搞定!