我是git的新手所以请耐心等待。
假设我有一个包含敏感数据的版本控制下的文件。果然,我将该文件放在我的.gitignore文件中,因此它不会被推送到repo。现在的问题是在我的项目的某个地方我有一个像
这样的行#include <sensitivedata>
或者您选择的语言。 问题是每当有人从该回购中克隆时,该文件丢失,并且在尝试构建/编译解决方案时出现致命错误。
所以,不是推送我正在实际工作的文件,而是想推送一些具有相同名称的虚拟文件,我在那里发表评论,如
// replace the next line with the sensitive data!!!
我该怎么做?
答案 0 :(得分:7)
您可以使用.gitatrributes过滤内容:
.gitattributes
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
E.g:
/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
答案 1 :(得分:0)
我不知道c ++预处理器是否能够做到这一点(我假设上面显示的代码是针对某些c风格的预处理器),但这是我在类似情况下所做的事情:
在git中提交:
投入gitignore:
然后我有基本上做的代码:
if (file_exists(user.config)):
use user.config
else:
use default.config
这样我可以提供一些合理的默认值,并且有一种简单而干净的方式来覆盖它。