你是如何管理本地 Git 仓库的呢?
一般我们都是随便创建一个目录,比如 ~/code
,在找一个同名的目录来 clone。
$ cd ~/code/egg
$ git clone git@gitlab.com:egg/egg.git
比较有条理的人可能会根据自己的习惯来分目录,但是遇到同名仓库时呢?可能新建个别名目录或新增一层目录。
$ cd ~/code/egg2
$ git clone git@github.com:eggjs/egg.git
这虽然是小事,但命名本身就是大事,而且可能没有规律,很容易忘记。
按 Git 仓库名来决定目录
所以我们采用 Git 仓库名来决定目录,保证本地目录的一致性,而且规则清晰。
$BASE
|- github.com
| `- eggjs
| `- egg
`- gitlab.com
`- egg
`- egg
使用 Projj 来管理
Projj是一个符合上述规则的工具,用来管理本地仓库。
安装
$ npm install projj -g
初始化
首先要初始化代码目录,使用 projj init
,默认为 ~/projj
。
添加仓库
使用 projj add
来添加仓库,与 git clone
无异,但可以通过 Hook 来更灵活的处理。
$ projj add git@github.com:eggjs/egg.git
添加到 ~/projj/github.com/eggjs/egg
,并添加至缓存 ~/.projj/cache.json
。
导入
你可以从已有的目录导入 Git 仓库
projj import ~/code
Hook
Hook 是非常灵活的功能,可以在仓库目录运行各种命令。
Command Hook
命令行的 Hook,目前只支持 add。
如果使用 Github 和内部 Gitlab 的同学肯定有这样的苦恼,总是把内网邮箱提交到 Github,或内部使用了非域名邮箱。那么就可以增加 postadd Hook 来自动处理。
#!/usr/bin/env node
'use strict';
const fs = require('fs');
const path = require('path');
const cwd = process.cwd();
const gitConfig = path.join(cwd, '.git/config');
if (!fs.existsSync(gitConfig)) {
return;
}
if (cwd.indexOf('gitlab.com') > -1 || cwd.indexOf('github.com') > -1) {
fs.appendFileSync(gitConfig, '[user]\n name = 名字\n email = 邮箱\n');
}
将此文件添加到 ~/.projj/hooks/git_config_user
,并添加执行权限 chmod +x ~/.projj/hooks/git_config_user
。
配置 Hook
{
"hooks": {
"postadd": "git_config_user"
}
}
执行 projj add
后可通过 git config -l
测试
也可直接使用 https://github.com/popomore/projj-hooks#git_config_user
{
"hooks": {
"postadd": "git_config_user"
},
"postadd": {
"github.com": {
"name": "popomore",
"email": "popomore@gmail.com"
},
"gitlab.com": {
"name": "popomore2",
"email": "popomore2@gmail.com"
}
}
}
Custom Hook
可以自定义 Hook,通过 run
或 runall
来执行。
比如删除所有仓库的 node_modules,可以使用 projj runall clean
请使用 https://github.com/popomore/projj-hooks#clean
projj-hooks
projj-hooks是一个 hooks 集,全局安装后就可以直接使用了。
总结
这个目录结构的原则很简单,但是对效率提升非常明显。Hook 非常灵活,想象空间非常大。