随着时间推移,需要管理的项目越来越多,而且还要考虑区分管理个人项目与公司项目,这里记录一下我个人的管理方案。
以下项目都是指 git 管理的项目。
我曾经遇到的烦恼:
遇到很多同学会把所有项目都放到同一个目录里,比如 ~/Code
,这样确实可以很容易找到曾经的项目,但缺陷也很明显:
当然解决重名好办,引入 "命名空间" 可破,git 项目天然就有命名空间,将 remote url 格式化成 github.com/facebook/react
就是唯一的,所以我也把这个映射关系用在我本地硬盘上,直接解决了上面的困扰~
$ git clone https://github.com/facebook/react ~/Code/github.com/facebook/react
我最终还写一段 zsh 脚本 gitcd.plugin.zsh (opens new window) 来实现这个效果:
$ gitcd https://github.com/facebook/react
# 相当于以下两句
$ git clone https://github.com/facebook/react ~/Code/github.com/facebook/react
$ cd ~/Code/github.com/facebook/react
一般来说,在不同场景下会有不同的身份,比如我会在 GitHub 上使用网名,而在公司内部 gitlab 使用真名。所以 git config 需要区分不同的 user.name
和 user.email
。
虽然可以每个 git 项目都敲一次 git config user.name xxx
,但是这很麻烦,也容易忘记。 我试过好几次 commit 完看 git log 才发现自己忘记单独配置而直接读了全局的 git 配置,将我的网名推到了公司仓库。
万幸发现了 git 2.13.0 以后有一个叫 conditional includes (opens new window) 的功能,可以实现不同目录自动使用不同的 gitconfig,配置一次就够了:
删掉 ~/.gitconfig
里的 user 章节,也就是不使用全局配置了
增加 includeIf 配置,意思是这两个目录下分别读不同的配置文件
# ~/.gitconfig
[includeIf "gitdir:~/Code/Personal/"]
path = .gitconfig-personal
[includeIf "gitdir:~/Code/Work/"]
path = .gitconfig-work
然后分别创建不同的配置文件,填写独立的信息
# ~/.gitconfig-work
[user]
name = My name in company
email = name@company.com
# ~/.gitconfig-personal
[user]
name = My GitHub username
email = name@mail.com
这样在不同的目录下,就可以很放心的提交了,不用再担心会不会搞混了网络身份,哦耶~
同样地,多个 ssh key 也是需要管理的
步骤
分别生成不同网站的密钥对
# gitlab.com
$ ssh-keygen -f ~/.ssh/id_rsa_gitlab -t rsa -N '' -C "A@mail.com"
# # github.com
$ ssh-keygen -f ~/.ssh/id_rsa_github -t rsa -N '' -C "B@mail.com"
# 参数解释
# -f : Specify file to output
# -t rsa : Specify the type of key to be generated
# -C : the comment
# -N: Specify the new passphrase
在~/.ssh/
目录下新建config
文件,用于配置各个公私钥对应的主机
# gitlab.com
Host gitlab.com
HostName gitlab.com
PreferredAuthentications publickey
IdentityFile ~/.ssh/id_rsa_gitlab
# github.com
Host github.com
HostName github.com
PreferredAuthentications publickey
IdentityFile ~/.ssh/id_rsa_github
在各个网站配置公钥
最后校验
$ ssh -T git@github.com