Git:如何确保无法删除未跟踪的配置文件

时间:2013-08-08 13:09:12

标签: git configuration config branching-and-merging gitignore

我怀疑,我的情况非常典型。我正在与一些其他人一起使用git进行版本控制的(年轻)项目。我们的项目是一个Web应用程序,需要对某些路径进行本地配置,并且密钥分布在几个不同的配置文件中。我们认为处理这个问题的一个好方法是制作这些配置文件的模板版本并在存储库中跟踪它,但不跟踪我们的个人配置文件(推荐,例如herehere)。为了确保没有人意外地提交他们的配置文件,我们将其添加到gitignore列表。

但我们没有在项目的开始中意识到这一点 - 只有在一个人启动它并且其他人加入之后。因此,在提交历史记录的早期跟踪了其中一个配置文件。我们的解决方案:remove it from the index,当然!

但是这会产生一个令人讨厌的问题!这是一个简化的场景:你有一个跟踪配置文件的分支。

git init # new repository
echo 'file a' > a.txt
git add a.txt
git commit -m 'initial commit'

然后您意识到这是一个问题,因此您创建一个新分支来修复它:在新分支上,您从存储库索引中删除配置文件(并添加您想要跟踪的模板版本)。然后gitignore原始文件。

git checkout -b testbranch
cp a.txt a.template.txt
echo 'a.txt' > .gitignore  # ignore a.txt
git add .gitignore
git add a.template.txt
git rm --cached a.txt
git commit -m 'make template file for a'
ls  # shows that a.txt and a.template.txt are still in working tree
git status  # shows that working directory is clean

当然会对配置文件进行重要更新。

echo 'super-critical config setting' >> a.txt

然后切换分支,合并和 BOOM !!

配置文件确实消失了,并且您在任何分支上都没有跟踪您所做的更改。

git checkout master
ls # shows a.txt, not a.template.txt
git checkout testbranch
ls # a.txt is gone!!

git checkout master
git merge testbranch master  # a.txt is gone forever!!

在gitignore文件中使用a.txt会屏蔽警告 从索引中删除文件然后切换分支将 覆盖或删除它。如果您执行上述步骤,除了 gitignoring a.txt,你不会被允许切换 testbranch没有移动或删除a.txt。如果你把它移动到 不同的未跟踪文件(a-copy.txt),结帐大师然后 结帐testbranch再次,你会看到a.txt已经消失,就像你一样 问它是,但a-copy.txt仍在那里。


这是我(可能)理解的部分。这是我不明白的: else 可能会给这个系统带来麻烦?由于git不跟踪单个文件,而是跟踪内容块,因此即使特定文件(名称)从未在存储库中被跟踪(特别是从未从索引中删除),超级关键配置设置也会丢失某些方式)?有没有办法绝对肯定从未以静默方式删除存储库中未跟踪(gitignored)的数据?

并且,为了记录,这里有其他选项来处理我遇到的本地配置。前三个看起来像黑客容易遗忘/错误,接下来的两个需要一些其他文件在本地配置并可能丢失。最后一个看起来有点矫枉过正,但也许不是。如果您确定其中一个是处理配置文件的最佳方式,请解释原因。如果你知道更好的东西,那就太好了!

  1. git stash
  2. git update-index --assume-unchanged
  3. 用于本地设置的单独分支,对每个单独的开发人员都是私有的
  4. git attribute filter driver(涂抹/清洁脚本)
  5. “部署”脚本,为每个开发人员再次分离和私有
  6. 每个开发人员都维护一个单独的存储库来跟踪他们的配置文件,完全独立于主代码库

1 个答案:

答案 0 :(得分:1)

敏感信息的一般经验法则是:

  

不要将敏感信息放在git中

无论您遵循什么样的政策(针对敏感内容的特殊分支,或某些“git update-index --assume-unchanged”策略),您总是有风险去推销您不应该做的事情。

Slaven Rezic mentions符号链接:

ln -s config.yaml.$username config.yaml

但这要求每个用户都有一个正确的配置文件,以及其中的敏感数据 如果该文件必须获得新的进化,则很难将它们传播到每个用户自己的配置(sylinked)文件中。

另一种选择是使用content filter driver

content filter

结账时会:

  • 阅读模板配置文件
  • 从git repo的外部参考访问敏感数据(您在此处定义自己的策略)
  • 生成一个(私有的,如“未版本化”的)配置文件,将值占位符替换为正确的数据。