如何在Git仓库中放置一个虚拟文件?

7

我是一名新手,关于git的知识还不够丰富,请多多包涵。

假设我有一个文件被纳入版本控制,并且其中包含敏感数据。当然,我在.gitignore文件中将该文件忽略掉了,以便它不会被推送到仓库中。但问题是,在我的项目中,我可能有这样一行代码:

#include <sensitivedata>

无论您选择哪种语言,本问题是每当有人从该存储库克隆时,该文件都会丢失,并且在尝试构建/编译解决方案时会出现致命错误。

因此,我不想推送我实际正在工作的文件,而是想推送一个同名的虚拟文件,其中我放置了类似于以下的注释

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

我该如何做到这一点?
2个回答

7
您可以使用.gitattributes来过滤内容:
  • .gitattributes

    secrets.h filter=secret merge=keepMine
    
  • .git/config

    [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”合并以防止意外合并。然而,据我所知,由于clean过滤步骤,本地更改应该是“不可见的”,因此合并甚至不会触发。无论secrets.h实际上包含什么内容,仓库文件始终包含以下内容:

// replace the next line with the sensitive data

例如:

/tmp/work$ echo '// 代理人007报告履行职责' > secrets.h
/tmp/work$ git status -s
M secrets.h
/tmp/work$ git diff
/tmp/work$ git cat-file -p HEAD:secrets.h
// 秘密内容不在版本库中


2
一提醒:.git/config 文件是本地文件。你需要确保仓库的所有用户都有过滤器定义,因为 .gitattributes 在仓库中。你可能需要阅读 git-attributes man页面 以了解更多细节。 - sehe

0
我不知道C++预处理器是否能够做到这一点(我假设上面显示的代码是某种C风格预处理器),但在类似情况下,以下是我的做法:
在Git中提交:
  • default.config
  • user.config.template

将其放入.gitignore文件中:

  • user.config

然后我有一段基本上做这个的代码:

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

这样我就可以提供一些合理的默认值,并且有一个简单而清晰的方法来覆盖它。


1
感谢您的输入。我曾考虑过与您类似的方案,但最终决定不这样做,因为我完全想将任何源代码控制问题与实际代码分开。但为了完整起见,如果其他人想采用这种方法,可以在 makefile 中使用类似以下的内容来完成:https://dev59.com/jHVC5IYBdhLWcg3w7V33#142926 - lightxx

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接