万事皆有可能,托管在 GitHub 上的仓库如果不备份,心里总不安。立即动手。
第一件事情是取得所有仓库列表。有了 API 就容易多了:
curl -s http://github.com/api/v2/yaml/repos/show/chunzi | grep ':url:' | awk -F/ '{print $NF}'
-s 表示 slient 模式,不输出下载进度。取来的数据是 yaml 格式,我只关心包含仓库名的 url 一行,grep 出来,打印路径最后一列,即仓库名称。
接下来写个简单脚本 github-backup,给定仓库名,如果从未备份过则 clone 裸仓库;否则下载更新。
#!/bin/bash
repo=$1
user=chunzi
url=git@github.com:$user
cd github
if [ ! -d $repo.git ]; then
git clone --bare $url/$repo.git $repo.git
cd $repo.git
git remote add --mirror origin $url/$repo.git
cd ..
else
cd $repo.git
echo `pwd`
git remote update
cd ..
fi
备份下来的仓库统一放在 ./github 目录下。用 --bare 克隆裸仓库,我不需要另行 check out 工作目录,仓库数据就已足够。然后用 git remote add 添加远程仓库以便以后增量更新。
如果目的只是单向备份下来,这里的 --mirror 选项可以不加,我试了下后续 git remote update 也能工作。
但是加了的话,应该表示本地仓库是远程的镜像,就是说,如果将新工作提交到这个本地裸仓库,就可以在此裸仓库中用 git push 将所有数据同步镜像到远程 GitHub 上。这一点我还没实践过,我现在只需要备份下来,不需要双向同步。
最后,写个简单的 Makefile,以后每次备份直接 make:
.PHONY: github
github:
curl -s http://github.com/api/v2/yaml/repos/show/chunzi | grep ':url:' | awk -F/ '{print $$NF}' | xargs -I% bin/github-backup %
Makefile 中的 $ 需要转义,方法是用两个 $,因为 Makefile 自己也有一套 $ 开头的变量。
另外,如果 github 上删除了仓库或者改了名字,需要手工处理备份的仓库。备份 github 以外的 git 仓库也是一样的,稍改下代码。最后放到 crontab 里自动备份。
Published on November 7, 2009 10:18 am.
Filed under: 开发 Tags: backup, git, github
有些项目因为各种原因没有放在 GitHub 上,免费账号只能开源。所以在自己的服务器上也有个 git 仓库目录,用 gitweb 浏览。以前很傻,在本地 git init 开始一个新项目后,总要 git clone --bare 的方式取出 .git 内的内容,然后打包 scp 到服务器再解开,最后在本地重新 clone 下来。由于最开始的时候用了这种方式,惯性思维使之保持了很久。
随着理解的深入,今天新建 project 的时候,便意识到完全可以不用如此麻烦。本地只管 git init 开始工作。要托管到自己服务器上去,登录后直接建立一个空的 git 仓库,--bare 参数说明当前 init 的不是工作目录:
$ mkdir ~/git/myapp.git
$ cd !$
$ git --bare init
然后在本地工作目录,只需建立关联。将此远程仓库挂进来,按惯例取名为 origin:
$ cd ~/myapp
$ git remote add origin ssh://myserver.com/home/chunzi/git/myapp.git
最后,按惯例将本地工作推送到服务器:
整个过程概念条理清晰。
Published on October 28, 2009 10:44 am.
Filed under: 开发 Tags: git
整理了下 planet.chunzi.me/perl 的配置,发到 github 上去 chunzi.planet。原来借用 bulknews 的 css 后来才发现被墙,改了下用本地的。另外用 feedburner 作了 feed 链接图标。原来 feed 的地址因为配置问题有误,感谢 Fayland 提醒~
既然有了关于 perl 的聚合,接下来还想搞下 git 和 vim 的。总之 planet.chunzi.me 站点就是 plagger 的集合。方便自己看,也方便别人看。说起来完全可以用 google reader 订阅这些地址,不过是这里的聚合作了简单过滤,仅仅是关心 perl 而不是人。就如同 Planet Perl Iron Man 所做的一样。
Published on October 25, 2009 5:30 pm.
Filed under: 开发 Tags: fayland, git, github, perl, perlchina, plagger, planet, vim
Github 上的 Network 图永远都不是最新的,gitk 很慢很丑陋(至少在我这里如此),gitweb 上又没有图。所以最佳的选择就是 tig。
tig 就是 text-mode interface for git 的意思,恰好又是 git 的回文。命令行模式下查阅 git 仓库信息的工具。
在 git 工作目录中打 tig 就可以看到所有的历史更新,按 g 便有树形图,按 h 就有简明帮助,按 m 再回到 main 页面,按 q 就直接退出,简洁明快。关键是就算工作目录在远程机器上,也没问题:ssh 上去,进 screen,tig 一下。
就觉得 tig 和 htop, bmon 是一挂的。Mac 上和 Ubuntu 上都可以通过 port 安装。
Published on September 27, 2009 9:16 pm.
Filed under: 开发 Tags: apple, bmon, git, github, gitk, htop, port, screen, ssh, tig, ubuntu
中间生小孩,加上积极性回落了一段时间,到现在终于把前三章翻译审校完成。其中一二两章是我翻译的,第三章是 DaNmarner 翻译的,我刚做完 review。目前 DaNmarner 正在翻译第四章,我接下来计划翻第五章。
原先我在自己的机器上架了 progit.chunzi.me ,方便查阅已经并入到主项目中的各语种翻译(中文),今天才发现一个月前官方博客更新,主站也放出了翻译进度。不过上面的也不是最新的,要看最新的可以直接到 github 项目页上去。
老实说,虽然 git 用了也快一年,但无非是些基本的操作。对于 rebase 什么的一直稀里糊涂,不敢用。所以想借此机会摸摸透。也希望能有更多的人参与到此项目,毕竟人多拾材火焰高。
本项目现在没有 deadline,反正是做一点少一点,愚公移山。但坚决不抛弃,不放弃,总归有一天可以做完的。最近看到一条说法,多动脑子消耗能量能够减肥,不管到底有多少,总归也是 more than nothing。
Published on September 22, 2009 2:36 pm.
Filed under: 开发 Tags: danmarner, git, github, progit, translate
电脑上最有价值的就是自己的数据,特别是自己创造出来的数据。不过往往会有很多文件散落在各处,备份和恢复起来又麻烦还没信心。不过我相信,好的管理策略和使用方法应该可以改善这种情况。
在我的 mac 上,代码都用 git 管理。所有 github 上的项目都放在用户主目录下的 github 目录中。私有的项目都放在 git-me 目录中。每次完成一部分改动,都要 commit 并 push 到外部的服务器上。
当然有时候会有些零散的工作,以前我都放在 sandbox 目录里面。然后定期 review 清理。但实际情况是,每次清理都会有一堆东西不置可否,结果就始终留在 sandbox 里面。
我想了想,应该把 sandbox 改名为 purge-me,是不是效果会好一点。sandbox 只是个名词,说明里面存放数据的状态,不过是草稿。草稿呢,有些还有用,有些完全可以丢弃,结果事情就开始混乱了。但 purge-me 是动词加宾语,每次在里面工作的时候,就会提示接下来要做的事情:及时清理。也就是提出一个明确的目标,每当临时工作告一段落,就该负责 purge me,保持有序和清洁,该 git 的 git 起来,该删的删。
最终目的是,就算硬盘突然坏掉,或者电脑被砸,或者启动自动销毁功能(希望有),或者被抢走,都不会丢失数据,即设备本身对我不重要。我知道该在什么地方找到自己想要的数据。
这次重装 Snow Leopard 就尝到了甜头,呵呵。
Published on September 10, 2009 12:11 pm.
Filed under: 开发 Tags: apple, git, gtd, leopard
progit 项目的各语种翻译正在进行。主项目不定期将大家的 commits 合并,但官方站点上并无显示目前的翻译结果,只有英文版全文。虽然 github 上也能读 markdown 的文件,但没有嵌入图片,阅读不流畅。我觉得能有个最终效果作为反馈很重要,相当于敏捷开发中的一个要素,及时频繁发布。
so, 写了个 progit-reader,架在 progit.chunzi.me 上。显示目前主项目中各语种的翻译。在自己本地也起了个服务,指向自己 fork 的 repos,复校的时候就看这个生成的页面。
Published on August 7, 2009 5:05 pm.
Filed under: 开发 Tags: git, github, progit, 阅读
昨天看到 github 正在举办项目排名推荐的竞赛。要求开源实现一段代码,通过给定的数据计算出推荐给用户的 10 个相关 repos,奖品是一瓶老酒外加无限制的 github 账号权限。后面这个比较诱人。竞赛成绩显示在排行榜上,不断有人在刷新记录。
说白了就是推荐系统,和豆瓣的推荐,和 Google Reader 右上角的推荐,和 Amazon 的类似商品推荐一样。许久以前买了《集体智慧编程》,说的就是怎样做推荐系统。不过当时也就走马观花看了前面两章。这回正好有机会实践一下,反正参加这个 contest 也没什么限制,我不指望排名,也不指望代码优雅。
以前从未写过类似的东西,上手了发现还满搞脑子的。基本上是用第二章介绍的最简单的,基于欧几里德距离评价的算法,也就是计算不同因素决定的多维空间中,两个点之间的距离,越近越相似。开始的时候,尝试比较所有给定仓库之间的相似性,但性能实在太糟糕。仓库数量远大于用户数量,这么做不经济。于是再改,把给定用户当前关注的仓库的所有特点拿出来,分配一个量,然后和所有其他仓库比较相似度。这样的计算大约在用户数乘以仓库数的级别,比起原来好很多了。后来又发现,量化数值时直接用编程语言所占行数表示,于是后边算平方和开根直接导致之前的性能问题。再后来,缩短参与计算的数据范围也改善了不少性能。现在基本上算一个用户的推荐,差不多花 2 到 10 秒左右。也不知道出来的结果能有多少击中率。
等算好了 push 一下,希望不要垫底,呵呵。
Published on July 31, 2009 12:54 pm.
Filed under: 开发 Tags: git, github
github 总可以给我带来惊喜。作为一个社交圈,我发现朋友 cnhacktnt 正在 watching progit 项目。于是就发现了这样一本关于 git 的图书,将在 Amazon 上卖,而图书原始内容就在这个项目内。迫不及待 git clone 下来。有点想要翻译的念头。先看一遍再说。
Published on July 28, 2009 3:30 pm.
Filed under: 开发 Tags: amazon, cnhacktnt, git, github, progit, translate
原本想做个音乐专辑的导航应用,一拍脑袋想出了muhub 这个名字,意思是 music-hub。当时很有些小得意,看起来就像是个 web2.0 的应用。没过多久发现,这名有个缺点,输入的时候都在右手,不方便,不快捷。
相反有个很好的例子就是 git,左右左,半秒搞定。有个同样不太好的例子是 cvs,都在左手。怪不得大家都觉得 git 比 cvs 用起来方便。
这只是个小问题。不过我认为影响人群行为的恰恰是许许多多这样的细节。
Published on July 20, 2009 2:14 pm.
Filed under: 开发 Tags: cvs, git, muhub