Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Git:如何确保未跟踪的配置文件是';t悄悄删除_Git_Configuration_Config_Branching And Merging_Gitignore - Fatal编程技术网

Git:如何确保未跟踪的配置文件是';t悄悄删除

Git:如何确保未跟踪的配置文件是';t悄悄删除,git,configuration,config,branching-and-merging,gitignore,Git,Configuration,Config,Branching And Merging,Gitignore,我想,我的情况相当典型。我正在和其他一些人一起使用git进行版本控制。我们的项目是一个web应用程序,它需要对分布在几个不同配置文件中的某些路径和密钥进行本地配置。我们认为处理这个问题的一个好方法是制作这些配置文件的模板版本,并在存储库中跟踪它,而不是跟踪我们的单个配置文件(推荐,例如和)。为了确保没有人意外提交他们的配置文件,我们将其添加到gitignore列表中 但我们在项目开始时并没有意识到这一点——只是在一个人启动项目,其他人加入之后。因此,其中一个配置文件在提交历史记录的早期被跟踪。我

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

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

但这造成了一个讨厌的抓到你了这里有一个简化的场景:您有一个跟踪配置文件的分支

git init # new repository
echo 'file a' > a.txt
git add a.txt
git commit -m 'initial commit'
然后,您意识到这是一个问题,所以您创建了一个新分支来解决它:在新分支上,您从存储库索引中删除配置文件(并添加您想要跟踪的模板版本)。然后忽略原始文件

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

配置文件真的消失了,您所做的更改不会在任何分支上被跟踪

gitignore文件中包含
a.txt
,会掩盖警告 从索引中删除文件,然后切换分支将 覆盖或删除它。如果您执行上述步骤,除了 如果您忽略
a.txt
,则不允许您从 testbranch不移动或删除
a.txt
。如果你把它移到一个 不同的未跟踪文件(
a-copy.txt
),签出主文件,然后 再次签出testbranch,您将看到
a.txt
不见了,就像您一样 要求它是,但是
a-copy.txt
仍然存在


这是我(可能)能理解的部分。我不明白的是:这个系统还有什么问题?既然git不跟踪单个文件,而是跟踪内容块,那么即使存储库中从未跟踪特定文件(名称)(尤其是从未从索引中删除)也有可能丢失超关键配置设置吗?有没有一种方法可以绝对确保存储库中未跟踪(gitignored)的数据永远不会被默默删除

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

  • git隐藏
  • git更新索引--假定未更改
  • 本地设置的单独分支,每个单独的开发人员专用
  • (涂抹/清除脚本)
  • “部署”脚本,对每个开发人员都是单独和私有的
  • 每个开发人员都维护一个单独的存储库,用于跟踪他们的配置文件,完全独立于主代码repo

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

    不要将敏感信息放在git中

    无论你遵循什么政策(针对敏感事物的特殊分支,或某种“策略”),你总是有风险推动不应该推动的事情

    符号链接:

    ln -s config.yaml.$username config.yaml
    
    但这需要每个用户都有一个正确的配置文件,以及其中的敏感数据。
    如果该文件必须获得新的演化,那么很难在每个用户自己的配置(sylinked)文件中传播它们

    另一个选择是使用

    在结帐时,它将:

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

    我使用的是
    git更新索引——假设对配置文件的本地更改不经常更改,则保持不变。顺便说一句:“超临界配置设置”?这听起来确实像是应该被追踪的。是的@DanielHilgarth,看起来确实应该被追踪。但是,如何在不覆盖其他开发人员的超临界设置的情况下做到这一点呢?也许你可以举例说明这种超临界设置。哦,任何设置都可以。在我们的例子中,Google+的API键就是一个例子。webroot的路径可以是另一个,并且这些设置对于每个开发人员都是不同的?
    
    ln -s config.yaml.$username config.yaml