在提交给Git之前从文件中删除敏感信息的语言无关的方法

时间:2013-05-13 08:50:00

标签: git version-control language-agnostic

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

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

personal_stuff = "some personal stuff"

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

5 个答案:

答案 0 :(得分:3)

对特定文件使用"clean filter"是另一种方法。

更新示例,如要求:

向本地存储库配置添加“干净”过滤器,包括对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的内容发生了什么,也就是说,刚才记录的提交中的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

答案 1 :(得分:1)

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

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

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

  1. 使用假人物(例如password = "mypassword1234"或其他......)
  2. 创建一个空文件
  3. 提交并推送此文件
  4. 使用git update-index --no-assume-unchanged your_file
  5. 忽略其未来修改

答案 2 :(得分:1)

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

编写实际的钩子可能是一个挑战,您应该能够找到some示例online

答案 3 :(得分:1)

将'.gitattributes'与'.gitfilters'一起使用。以下是'rcs-keywords'的示例;你会遵循相同的结构,但需要使用过滤器来处理敏感数据。

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

# .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'过滤器在提交之前删除了东西; “涂抹”过滤器会在结帐时添加内容

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

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

删除了rcs IdDate信息。关联的“涂抹”过滤器会重新添加该信息。

最后,将git配置为

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

对于您的情况,清洁过滤器会锁定敏感数据,而污迹过滤器会将其重新添加。

答案 4 :(得分:0)

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

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