我是git的新手,所以请耐心等待。
假设我有一个受版本控制的文件,其中包含敏感数据。果不其然,我把那个文件放在了我的.gitignore文件中,这样它就不会被推送到repo。现在的问题是在我的项目中,我有一条类似的线路
#include <sensitivedata>
或者你选择的任何语言。问题是,每当有人从该repo中克隆时,该文件就会丢失,并且在尝试构建/编译解决方案时会出现致命错误。
因此,我不想推送我实际正在处理的文件,而是想推送一些同名的伪文件,在那里我放置一个类似的注释
// replace the next line with the sensitive data!!!
我该怎么做?
您可以使用.gittributes来过滤内容:
-
.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"合并,以防止意外合并。然而,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
我不知道c++预处理器是否能够做到这一点(我假设上面显示的代码是针对某些c风格的预处理器的),但在类似的情况下我会这样做:
以git:提交
- default.config
- user.config.template
放入gitignore:
- user.config
然后我有了基本上可以做到的代码:
if (file_exists(user.config)):
use user.config
else:
use default.config
这样我就可以提供一些合理的默认值,并有一个简单干净的方法来覆盖它