基于文件夹的个性化 git 配置方法

在一些时候,我们希望 git 有不同的配置。 比如自己的开源或者私人项目用一套 git 配置,其中 user.name 是 xyz, user.email 是 [email protected] 公司项目用另外一套 git 配置,user.name 是 Real Name、 user.email 是 [email protected]

git config 支持系统层级 --system、 用户层级 --global 与仓库层级(无选项)的配置。但是, 对于大量项目,手动地通过 git config 指定未免过于繁琐。 本文介绍了一种通过修改 git 的配置文件 .gitconfig,使用 [includeIf] 对某个文件夹下的所有 git 项目指定 git 配置的方法。

git 配置文件层级

在 git 中,有三个层级的配置文件:

  1. 系统层级: /etc/gitconfig,作用于系统中所有用户的 git 配置;
  2. 用户层级: $HOME/.gitconfig,作用于用户的 git 配置;
  3. 项目层级: .git/config,作用于项目中。

如果有相同的配置,按照 项目 > 用户 > 系统 的优先级获取配置。

[includeIf]

从 git 2.13.0 开始,git 配置文件开始支持 Conditional Includes 的配置。通过设置 includeIf.<condition>.path,可以向命中 condition 的 git 仓库引入 path 指向的一个 git 配置文件中配置。

[includeIf] 的语法如下,<keyword> 为关键词,<data> 是与关键词关联的数据, 具体意义由关键词决定。

1
2
[includeIf “<keyword>:<data>”]
path = path/to/gitconfig

其中支持的 keyword 有:

  1. gitdir: 其中 <data> 是一个 glob pattern 如果代码仓库的.git目录匹配 <data> 指定的 glob pattern,那么条件命中;
  2. gitdir/igitdir的大小写不敏感版本。
  3. onbranch:其中 <data> 是匹配分支名的一个glob pattern。 假如代码仓库中分支名匹配 <data>,那么条件命中。

就我们的需求,使用 gitdir 完全可以。

例子

假设在家用工作电脑上,我们默认开发的是个人项目。有时为了应对紧急需求, 会将公司项目 clone 到电脑中,统一放置放到 ~/corp-projects/ 目录下面。 个人项目与公司项目的差异点在:第一、使用的邮箱名不同, 个人项目会使用个人邮箱,公司项目使用公司邮箱;第二, 公司项目可能需要 VPN 接入才能够存取代码库。 我们首选使用,用户层级的 git 配置文件。

1vim ~/.gitconfig

在最后添加一个 conditional include:

1
2
3
# ~/corp-projects/ 下面的所有仓库引入 `~/crop-projects/.gitconfig` 中的配置
[includeIf “gitdir:~/corp-projects/”]
path = ~/corp-projects/.gitconfig

最后创建公司项目统一的配置文件:

1vim ~/corp-projects/.gitconfig
1
2
3
4
5
6
7
[user]
name = <Your Name>
email = <Your Email>

[http]
# 代理地址,如果公司项目需要代理才能够存取,填写此项;如果不需要,则不用这一行
proxy = <Proxy URL>

node cli 开发 (command line interface)

开发 node cli 的核心是依赖 node process 来获取所输入进命令行的参数,根据参数来执行任务。
例子

// 新建一个cli.js 文件写入如下代码
// 写的文件头部加`#!/usr/bin/env node`,用于动态检测出不同用户各自的 node 路径并执行
#!/usr/bin/env node
console.log(process.argv)

在terminal中执行如下命令

node cli.js name age place
// 输出显示如下结果
[ '/usr/local/bin/node',
  '/your_programs/cli.js',
  'name',
  'age',
  'place' ]

从上面结果可以看出来返回一个数组。
数组第一个字符串含义为 node 命令所在的目录;
数组第二个字符串含义为执行文件所在的目录;
之后的字符串为在命令行输入的参数。

以上为获取参数方法,下面让我们看看如何封装自定义命令
很简单,在package.json文件中增加 key 为 bin 的值。
例子

{
  "name": "cli-exercise",
  "bin": {
    "cli": "dist/index.js"
  }
}

bin 的值可以为key-value形式,也可以是字符串。
当为key-value形式的时候,key为自定义的命令,value为输入命令后执行的文件。
当为字符串的时候,则只代表执行的文件,自定义命令则为package.jsonkeyname的值。

做完这些我们如何在本地测试呢?
在项目目录下执行
npm link
执行cli name age place
输出如下结果

[ '/usr/local/bin/node',
  '/your_programs/cli.js',
  'name',
  'age',
  'place' ]

最后一步:
上传到npm上我们就可以全局安装使用了。

以上我们就完成了 node cli 简单的工具开发。

示例项目:
cli-exercise
GitHub npm