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

时间:2013-07-05 07:30:15

标签: git version-control git-commit git-add git-commands

我是git的新手所以请耐心等待。

假设我有一个包含敏感数据的版本控制下的文件。果然,我将该文件放在我的.gitignore文件中,因此它不会被推送到repo。现在的问题是在我的项目的某个地方我有一个像

这样的行
#include <sensitivedata>

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

所以,不是推送我正在实际工作的文件,而是想推送一些具有相同名称的虚拟文件,我在那里发表评论,如

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

我该怎么做?

2 个答案:

答案 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中提交:

  • default.config
  • user.config.template

投入gitignore:

  • user.config

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

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

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