一种管理本地 Git 仓库的工具
发布于 7 年前 作者 popomore 7465 次浏览 来自 分享

你是如何管理本地 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,通过 runrunall 来执行。

比如删除所有仓库的 node_modules,可以使用 projj runall clean

请使用 https://github.com/popomore/projj-hooks#clean

projj-hooks

projj-hooks 是一个 hooks 集,全局安装后就可以直接使用了。

总结

这个目录结构的原则很简单,但是对效率提升非常明显。Hook 非常灵活,想象空间非常大。

7 回复

赞。目录结构一眼有 go get 的既视感😂

非常棒,已经用上 自豪地采用 CNodeJS ionic

老司机,公司和github同时用,确实有这个痛苦,单独设置origin老是容易忘记。。。。

用了半年了,爽歪歪

回到顶部