gitencryption/解密远程存储库文件,同时推/拉

在传输到远程存储库之前,是否可以通过“git push”自动encryption文件? 并且在'git pull'时自动解码它们。

也就是说,如果我有一个远程服务器与共享访问存储在那里,我不希望我们的项目被盗取没有许可…也许有一些特殊的git钩之前,推后拉?

是和不是。

你可以试着依靠钩子,但是假设它们被安装在远程位置,这并不总是可靠的。

另一种达到几乎相同效果的方法是使用一个smudge / clean属性filter驱动程序但不能用于完整的回购

黑灰/清洁

(来源: Pro Git书籍 : 自定义Git – Git属性 )

这样,污迹脚本就可以解码文件,而干净的脚本会对它们进行编码。
再次,这可能适用于一些敏感的文件, 而不是一个完整的回购

当然,这些脚本不会在存储库本身,并将以另一种方式进行pipe理/沟通。

正如Alkaline 在评论中指出的那样,这个想法并没有规模回购,因为主要的git维护者Junio C. Hamano在2009年回应说 :

由于diff.textconv的唯一存在理由是允许在给予文本差异之前将潜在有损耗的转换(例如msword到文本)应用于原像和后像对内容(应该是“干净的”)人类消费。

上面的configuration似乎可以工作,但是如果你真的想要一个encryption的仓库,你应该使用一个encryption文件系统。
这会带来额外的好处,即与您的资源库关联的工作树也将被encryption


尽pipe它没有扩展到完整的回购,但是这个想法是在git-crypt实现的(3年之后),详见Dominic Cerisano的回答 。
git-crypt使用内容filter驱动程序 (在cpp中实现,通过commands.cpp使用相关的smudgecleanfilter命令设置.gitattributes )。
作为任何内容filter驱动程序,您可以在相同的.gitattributes文件.gitattributes git-crypt的应用程序限制为所需的一组文件:

 secretfile filter=git-crypt diff=git-crypt *.key filter=git-crypt diff=git-crypt 

README中所述 :

git-crypt依赖于gitfilter,而gitfilter并没有考虑到encryption的devise。

因此, git-crypt不是encryption存储库中大部分或全部文件的最佳工具。
git-crypt真正用处在于你的大部分版本库都是公开的,但是你需要encryption一些文件(可能是私钥名为*.key ,或者是一个带有API凭证的文件)。

要encryption整个存储库,请考虑使用像git-remote-gcrypt这样的系统。

你可以看看这个项目: https : //github.com/shadowhand/git-encrypt

更新 :这个上面的项目已被弃用,并build议使用https://github.com/AGWA/git-crypt

如何使用git-crypt保护公共和私有的远程资产。

  • 对所有的git客户端和服务都是透明的(例如,GitHub,BitBucket等)。
  • Linux,OSX和Windows支持。
  • 资产级encryption(请参阅VonC的答案 )。
  • AES-256密码。

创build您的256位私钥(保留并保护此密钥)

 sudo apt install git-crypt mkdir key; cd key; git init; git-crypt-init git-crypt export ~/crypt.key 

提交 .gitattributes一个名为.gitattributes的文件送到每个.gitattributes的根目录。
它应该包含您希望encryption的每个文件,目录或types的资产模式:

 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 

在每个回购中encryption资产:

 cd repo-root-directory git-crypt unlock ~/crypt.key git-crypt status -f Commit&Push (from command line or git client) 

像往常一样继续你的git工作stream程。

  • 在这些安全回购的任何新克隆上运行一次git-crypt unlock ~/crypt.key
  • 您可能希望清除所有分支机构和标签上的旧未encryption的提交历史logging。
  • 如果你使用一个git客户端,它必须完全支持gitfilter和差异。

有两种方法可以做到这一点。

一个是使用像git-crypt这样的项目, http: //www.agwa.name/projects/git-crypt/,它添加了用于拉和推的过程,或者手动设置filter,如https:// gist.github.com/shadowhand/873637

如果你在linux环境下工作,另一种方法是使用ecryptfs。 对于这种情况,例如,可以在您的项目目录的基础上创build两个目录

 project/encrypted_src project/src 

然后从项目目录的根目录下使用命令装载

 sudo mount -t ecryptfs encrypted_src src 

input密码并在提示时接受默认值。 此时,放置在src /中的文件将被encryption为encrypted_src / on。 当你完成了

 sudo umount src 

只有encryption的文件保留。 基本上文件被提交并从encryption的src /推送并在src中编辑。 只要每个人都使用相同的密码(或使用相同的密钥),回购可以在开发人员之间共享。 你也可以得到更好的。 您可以encryption文件名以及文件内容,也可以使用不同的密码或密钥encryption回购库中的不同文件夹。 如果你的configuration文件具有敏感的访问信息,个别组(开发,testing,生产)将要私人维护,最后一个function是很好的。

尽pipe如此,请注意,一旦你开始encryption的东西。 你放松了很多源代码pipe理的优点,比如能够看到各种提交之间的差异。 如果你有任何规模的项目,审查提交的能力将是非常宝贵的。 如果您希望在某个时候出现错误,那么通过提交历史logging进行回溯分析和查找引入点的能力也是非常宝贵的。 因此,首先保护您的服务器,然后仅在有意义的情况下使用encryption来保护源代码pipe理中的敏感信息。 只是我2美分。

git-annex提供了Tahoe-LAFS钩子,这可能会比你需要的更为复杂。