我有一个我正在处理的应用程序的存储库,其中包含一个配置文件。目前,我使用.dist
扩展名进行分发,并让用户在编辑文件之前重命名该文件。
nate:~/myAwesomeApp% git ls-files
.gitignore
README
config.dist
glorious_support_lib.p
bestProgramEvar.f90
这很好,花花公子,实际的配置会被忽略。
nate:~/myAwesomeApp% cat .gitignore
config
然而,如果我可以将该配置文件以其真实名称分发并准备编辑,同时将其忽略,以便新存储库的副本具有 sweet 一个“功能”的发行版,它不被覆盖,破坏或以其他方式骚扰,并且用户不必担心通过一个推送或发布他们的超级秘密配置细节到interwebs无意的git commit -a -m 'hurrrr derp! oopsies!' && git push
有没有办法做到这一点?让git保留在克隆出来的文件的单个原始版本中,但此后被忽略了吗?
我确信之前已经问过,但对于我的生活,我的google-fu失败了。把学校放在深处,SO。
答案 0 :(得分:6)
我可能会包含某种将'config.dist'复制到'config'的'install'脚本。
我认为没有办法让文件既不被忽略也不被忽略。
答案 1 :(得分:4)
这是一个很好的问题,但AFAIK没有针对此的git解决方案。
几点解决方法:
config.dist
不存在时阅读config
(例如,PHPUnit使用此技术)答案 2 :(得分:3)
您还可以进行版本和分发:
.gitattributes
个文件(仅限'config.dist')config
文件中的私有内容)现在,这是一个过滤器驱动程序的一点点(它是关于修改文件的内容,regardless of its "state", i.e its full path and name)。但它可以工作。
.gitattributes
将包含:
config.dist filter=generateConfig
您可以注册涂抹脚本(在创建/更新工作目录时的结帐步骤中应用),如:
git config --global filter.generateConfig.smudge /path/to/generateConfig
答案 3 :(得分:1)
正如其他人所指出的那样,在Git中没有神奇的解决方案。据我所知,它与其他版本控制系统相同。
Hooks在这里也没有解决方案,如果它们以这种方式工作,这将是一个严重的安全威胁 - 只需克隆一个回购,一个邪恶的代码就可以在你的机器上执行。
但是要使用你的应用程序,除了使用git克隆它之外,用户还必须至少做一件事:运行你的应用程序。
如果修改运行应用程序所需的配置文件不是,那么如果您的程序在启动时执行if [ ! -e config ] ; then cp config.dist config ; fi
,那么应该是恕我直言。另外,您应该在config.dist
内面发出警告,警告您不应该修改此文件,而是复制它。
如果需要修改配置文件 ,则启动没有配置文件的程序可能会启动某种安装模式,要求用户输入所需的配置选项并保存。
第三种可能是您的应用无法在启动时修改配置文件(可能只是一些JavaScript + HTML文件)。在这种情况下,除了拥有一些单独的构建脚本或让用户手动执行此操作外,我没有其他选择。