繁体   English   中英

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

[英]Git: How to be sure untracked config files aren't silently deleted

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

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

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

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除外),则不允许在不移动或删除a.txt情况下切换testbranch。 如果你将它移动到另一个未跟踪的文件( a-copy.txt ),checkout master然后再次checkout testbranch,你会看到a.txt已经消失,就像你要求的那样,但是a-copy.txt还在那里。


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

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

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

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

不要把敏感信息放在git中

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

Slaven Rezic 提到了符号链接:

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

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

另一种选择是使用内容过滤器驱动程序

内容过滤器

它将在结帐时:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM