在转移到远程存储库之前,是否可以通过'git push'自动加密文件?并在'git pull'时自动解码它们。
即如果我有一些远程服务器与git存储库共享访问,我不希望我们的项目在未经许可的情况下被盗...... 也许在推拉之前有一些特殊的git-hooks?
答案 0 :(得分:23)
是和否。
您可以尝试依赖钩子,但假设它们安装在远程位置,并不总是可靠的。
实现几乎相同效果的另一种方法是使用 smudge/clean attribute filter driver ,,但不能使用完整的回购。
(来源:Pro Git book:Customizing Git - Git Attributes)
这样涂抹脚本就能解码文件,而干净的脚本会对它们进行编码 同样,这可能适用于一些敏感文件,不适用于完整的回购。
当然,这些脚本不会存放在存储库本身,而是通过其他方式进行管理/通信。
由于Alkaline指出in the comments,这个想法无法扩展为回购,因为主要的git维护者Junio C. Hamano comments back in 2009:
diff.textconv
唯一的存在理由是允许潜在的损失 应用于原像和后像的转换(例如msword-to-text) 在给出文本之前的一对内容(应该是“干净的”) 差异化为人类消费。上面的配置似乎可行,但如果你真的想要一个加密的存储库,你应该使用加密文件系统。
这将为工作树带来额外的好处 与您的存储库相关联的文件也将被加密。
即使它没有扩展到完整的回购,但是这个想法已经用 git-crypt
实现了(3年后的2013年),详见Dominic Cerisano的{ {3}}。
git-crypt
使用内容过滤器驱动程序(在cpp中实施,answer使用相关.gitattributes
和smudge
设置clean
过滤命令)。
作为任何内容过滤器驱动程序,您可以在同一git-crypt
文件中将.gitattributes
的应用程序限制为所需的文件集:
secretfile filter=git-crypt diff=git-crypt
*.key filter=git-crypt diff=git-crypt
作为commands.cpp
:
git-crypt
依赖于未使用加密设计的git过滤器 心里。因此,
git-crypt
不是加密大多数或最佳的最佳工具 存储库中的所有文件git-crypt
真正闪耀的地方是大多数存储库是公共存储的,但是您需要加密一些文件(可能是名为*.key
的私钥或具有API凭据的文件)。要加密整个存储库,请考虑使用类似 mentioned in the
README
的系统。
(请参阅git-remote-gcrypt
的更多内容, spwhitton/ tech/ code/ git-remote-gcrypt )
答案 1 :(得分:12)
您可以查看此项目:https://github.com/shadowhand/git-encrypt
更新:以上项目已弃用,建议使用https://github.com/AGWA/git-crypt
答案 2 :(得分:8)
创建您的256位私钥(保留并保护此密钥)
sudo apt install git-crypt
mkdir key; cd key;
git init; git-crypt init
git-crypt export-key ~/crypt.key
提交并推送名为.gitattributes
的文件到每个repo的根目录。
它应该包含您希望加密的每个文件,目录或类型的一个资产模式:
docs/doc.txt filter=git-crypt diff=git-crypt
js/** filter=git-crypt diff=git-crypt
*.java filter=git-crypt diff=git-crypt
src/cpp/*.h filter=git-crypt diff=git-crypt
每个仓库中的加密资产:
cd repo-root-directory
git-crypt unlock ~/crypt.key
git-crypt status -f
Commit&Push (from command line or git client)
像往常一样继续您的git工作流程。
git-crypt unlock ~/crypt.key
一次
这些安全的回购。
答案 3 :(得分:6)
有两种方法可以做到这一点。
一个是使用像git-crypt这样的项目, http://www.agwa.name/projects/git-crypt/ 它可以为拉动和推动过程添加更多功能,或者按照此处所述手动设置过滤器 https://gist.github.com/shadowhand/873637
如果你在linux环境中工作,另一种方法是使用ecryptfs。对于这种情况,例如,在项目目录的基础上,您可以创建两个目录
project/encrypted_src
project/src
然后从项目目录的根目录中使用命令
挂载sudo mount -t ecryptfs encrypted_src src
输入密码并在提示时接受默认值。此时,放在src /中的文件将被动态加密为encrypted_src /。当你完成后
sudo umount src
只保留加密文件。本质上文件是从encrypted_src提交和推送的,并在src中编辑。 只要每个人都使用相同的密码短语(或使用相同密钥安装),repo就可以在开发人员之间共享。你也可以变得更加漂亮。您可以加密文件名以及文件内容,或使用不同的密码短语或密钥加密仓库中的不同文件夹。如果您的配置文件具有敏感的访问信息,以便各个组(开发,测试,生产)希望私下维护,那么最后一个功能就不错了。
尽管如此,请注意,一旦你开始加密东西。你失去了很多源代码控制的优点,比如能够看到各种提交之间的差异。如果您有任何规模的项目,审查提交的能力将是非常宝贵的。如果你期望在某些时候出现错误,那么通过提交历史记录进行反向跟踪来分析和找到引入点的能力也是非常宝贵的。因此,首先保护您的服务器,然后仅在有意义的地方使用加密来保护源代码管理中的敏感信息。我的2美分。
答案 4 :(得分:1)
git-annex提供了Tahoe-LAFS挂钩,这可能比您需要的更复杂。