7

我是 git 的新手,所以请多多包涵。

假设我有一个受版本控制的文件,其中包含敏感数据。果然,我把那个文件放在我的 .gitignore 文件中,所以它不会被推送到 repo。现在的问题是在我的项目中的某个地方我有一条线

#include <sensitivedata>

或任何您选择的语言。问题是每当有人从该存储库中克隆时,该文件就会丢失,并且在尝试构建/编译解决方案时会出现致命错误。

因此,我不想推送我实际上正在处理的文件,而是想推送一些具有相同名称的虚拟文件,我在其中放置评论,例如

// replace the next line with the sensitive data!!!

我该怎么做?

4

2 回答 2

7

您可以使用 .gitatributes 过滤内容:

  • .git 属性

    secrets.h filter=secret merge=keepMine
    
  • .git/配置

    [filter "secret"]
    clean  = echo "// replace the next line with the sensitive data"
    smudge = cat
    
    [merge "keepMine"]
        name = always keep mine during merge
        driver = /bin/true %O %A %B
    

我加入了“keepMine”合并以防止意外合并。但是,AFAIK 合并甚至不应该启动,因为由于clean过滤步骤,本地更改实际上是“不可见的”。无论 中实际有什么secrets.h,repo 文件都将始终包含:

// replace the next line with the sensitive data

例如:

/tmp/work$ echo '// agent 007 reporting for duty' > secrets.h
/tmp/work$ git status -s
M secrets.h
/tmp/work$ git diff
/tmp/work$ git cat-file -p HEAD:secrets.h
// secret contents not in repo

于 2013-07-05T07:41:22.223 回答
0

我不知道 c++ 预处理器是否能够做到这一点(我假设上面显示的代码适用于某些 c 风格的预处理器),但这是我在类似情况下所做的:

在 git 中提交:

  • 默认配置
  • 用户配置模板

放入 gitignore:

  • 用户配置

然后我有基本上可以做的代码:

if (file_exists(user.config)):
    use user.config
else:
    use default.config

这样我就可以提供一些合理的默认值,并有一种简单而干净的方式来覆盖它。

于 2013-07-05T08:36:52.700 回答