- Published on
Git 敏感信息加密与合并忽略
- Authors
- Name
- 老杨的博客
1. 需求
相信大家都有这样的场景,含敏感信息的配置文件等想加密上传至 git,而且不同分支的配置文件并不相同,合并时不想他们合并。
2. git 删除敏感信息文件
针对可能已经上传了敏感信息的 git 文件,想在记录中彻底删除他们。
cd /path/to/project
git filter-branch --force --index-filter "git rm --cached --ignore-unmatch PATH-TO-YOUR-FILE-WITH-SENSITIVE-DATA" --prune-empty --tag-name-filter cat -- --all
# 以下命令要生效到远程仓库,请谨慎
git push origin --force --all # 注意分支保护和权限
git push origin --force --tags # 注意分支保护和权限
3. git 加密方案 git-crypt
安装 git-crypt,支持 yum, apt, brew 等。加密方式使用共享密钥和 GPG 密钥方式二选一即可。
3.1 初始化
cd /path/to/project
git-crypt init # 类似于 git init,安装 git-crypt 到项目中
3.2 GPG 密钥方式
加密工具 gpg 生成公私钥(生成后注意备份):
# gpg --full-generate-key
gpg --gen-key # 生成密钥(公钥和私钥),按照流程提示进行
gpg --list-keys # 列出当前所有的密钥,检查刚才的密钥是否生成成功
git-crypt add-gpg-user youname # 添加密钥用户
.gitattributes
3.2 配置 文件格式和 .gitignore
一样,如:
secretfile filter=git-crypt diff=git-crypt
*.key filter=git-crypt diff=git-crypt
secretdir/** filter=git-crypt diff=git-crypt
上传到 git
git rm -r --cached config/ # 清理 config 的 git 缓存
git add .
git commit -m 'chore: git-crypt'
git push
3.3 共享密钥方式
导出密钥,文件 git-crypt-key
,
git-crypt export-key ../git-crypt-key
导出了密钥以后,就可以分发给有需要的团队内部人员。
当团队其他成员获取了代码以后,需要修改配置文件,需要先解密,解密动作只需要做一次,往后就不需要再进行解密了。
解密
cd /path/to/project
git-crypt unlock /path/to/git-crypt-key
4. 合并忽略指定文件
创建自定义 merge driver:
git config --global merge.ours.driver true
在被合并的分支下配置 .gitattributes
,如 dev 合并到 master,则在 dev 分支中配置,合并后 .gitattributes
也将合并到 master 分支下。结合上文中的 git-crypt,内容如:
secretfile filter=git-crypt diff=git-crypt merge=ours
*.key filter=git-crypt diff=git-crypt merge=ours
secretdir/** filter=git-crypt diff=git-crypt merge=ours
提交并进行合并即可。
重要
- 如果 dev 的某个文件修改不需要合并到 master ,则 master 的文件修改时间必须在 dev 的修改时间之后。
- 上文 dev 向 master 合并,需要先修改 dev 分支的文件并提交,再修改 master 的文件并提交,然后合并。
Git-secret 工具也不错,它具有更多的命令行功能,[6] 中有人总结了他们之间的差异。
参考资料: [1] https://github.com/AGWA/git-crypt
[2] https://einverne.github.io/post/2019/11/git-crypt-usage.html
[3] https://buddy.works/guides/git-crypt
[4] https://embeddedartistry.com/blog/2018/03/15/safely-storing-secrets-in-git/
[5] https://blog.csdn.net/fkaking/article/details/44955663
[6] https://github.com/sobolevn/git-secret/issues/101