1

在提交到 Git 之前自动从文件中删除敏感信息的推荐程序是什么?

例如,假设我在一个名为的文件中有以下内容code.rb

personal_stuff = "some personal stuff"

如何code.rb在提交版本控制之前自动删除个人信息?解决方案应该与语言无关。

4

5 回答 5

3

对特定文件使用“干净过滤器”是另一种方法。

根据要求更新示例:

向本地存储库配置添加一个“干净”过滤器,包括一次调用sed. 这可以是 shell 脚本的路径,也可以是任何在其标准输入上使用数据并将处理后的数据写入其标准输出的程序的路径:

$ git config --add filter.classify.clean \
    'sed -e '\''s!\<\(personal_stuff\s\+=\s\+\)"[^"]\+"!\1"SECRET"!'\'

现在注册我们的过滤器以应用于名称匹配的文件*.rb

$ cat >.gitattributes
*.rb    filter=classify
^D

创建几个测试文件:

$ cat >test.rb
aaa
bbb
        personal_stuff  = "sensitive data"
ccc
^D
$ cat >test.txt
aaa
xxx
personal_stuff = "super secret"
yyy
^D

现在添加并提交它们:

$ git add test.*
$ git commit -q -m 'root commit'
...

现在看看 的内容发生了什么变化test.rb,也就是刚刚记录的 commit 中它的 blob 包含了什么:

$ git cat-file -p HEAD
tree 7adaac5cc23c69ff9459635d666ca63ffb9757aa
author Konstantin Khomoutov <flatworm@...ourceforge.net> 1368453302 +0400
committer Konstantin Khomoutov <flatworm@...ourceforge.net> 1368453302 +0400


root commit 
$ git cat-file -p 7adaa
100644 blob e49630236eb74d8c7ccbcccc83c7c18af0cb4b96    test.rb
100644 blob aecd9ade78e18d5b5ded99a1e41cf366fa52e619    test.txt
$ git cat-file -p e496302
aaa
bbb
        personal_stuff  = "SECRET"
ccc

验证这不会影响工作树:

$ cat test.rb
aaa
bbb
        personal_stuff  = "sensitive data"
ccc
于 2013-05-13T09:11:43.507 回答
1

一种解决方案是将您的机密信息移动到将被忽略的外部文件。

有两种方法可以忽略 git 中的文件:

在您的情况下,更灵活的解决方案是:

  1. 用虚假的个人资料创建一个空文件(比如password = "mypassword1234"或其他......)
  2. 提交并推送此文件
  3. 忽略它的未来修改git update-index --no-assume-unchanged your_file
于 2013-05-13T08:57:12.213 回答
1

您可以编写自己的预提交挂钩。这个钩子会扫描你的代码并拒绝提交,如果它可以找到它不喜欢的东西。

编写实际的钩子可能是一个挑战,你应该可以在网上找到一些例子。

于 2013-05-13T08:57:14.957 回答
1

将“.gitattributes”与“.gitfilters”一起使用。这是一个带有“rcs-keywords”的例子;您将遵循相同的结构,但对敏感数据使用过滤器。

您的属性文件从文件 glob 映射到过滤器,如下所示:

# .gitattributes
# Map file extensions to git filters
*.h filter=rcs-keywords
*.c filter=rcs-keywords

您的 .gitfilters 文件实现了“干净”和“涂抹”过滤器。对于上面的“rcs-keywords”过滤器,这是:

$ ls .gitfilters/
rcs-keywords.clean*  rcs-keywords.smudge*

'clean' 过滤器在提交之前删除内容;'smudge' 过滤器在结帐时添加东西

过滤器是任何脚本。同样,对于 'rcs-keywords','clean' 过滤器看起来像:

#!/usr/bin/perl -p
s/\$Id[^\$]*\$/\$Id\$/; 
s/\$Date[^\$]*\$/\$Date\$/;

从而删除rcsId和信息。Date相关的“涂抹”过滤器会重新添加该信息。

最后,您将 git 配置为

git config --add filter.rcs-keywords.clean  .gitfilters/rcs-keywords.clean
git config --add filter.rcs-keywords.smudge .gitfilters/rcs-keywords.smudge

对于您的情况,干净的过滤器会删除敏感数据,而涂抹过滤器会将其重新添加。

于 2013-05-13T14:25:19.560 回答
0

如果您不能使用 .gitignore ,因为您需要在同一个文件中进行并行更改(如您的评论中所见),那么一个选项是git add -p 使用它,您可以相应地添加或跳过。

在这里使用上述 git 命令的问题是,这将是一个手动过程。我猜你可能找不到任何其他自动化方法来解决你的问题。

于 2013-05-13T12:33:07.100 回答