能否将.gitignore移至config子目录,实现根目录配置文件规整?
一、子目录的.gitignore规则能作用于父目录吗?
直接给你结论:默认情况下不行。Git的.gitignore规则是「从上到下」生效的——某个目录下的.gitignore只会对该目录及其所有子目录的文件生效,没办法向上影响父目录的文件。
不过有两种替代方案可以实现类似效果:
方法1:指定仓库级别的忽略文件
用Git命令把config目录下的.gitignore设置为仓库全局的忽略规则文件:git config core.excludesfile ./config/.gitignore这样整个仓库(包括根目录)都会读取这个文件里的忽略规则。注意这个设置是本地的,其他克隆仓库的开发者需要自己执行这个命令,或者你可以把这个步骤加到项目的初始化脚本里(比如package.json的
postinstall脚本)。方法2:根目录.gitignore引用子目录规则
如果不想改Git配置,也可以在根目录的.gitignore里添加一行:!include ./config/.gitignore不过要注意,这个
!include语法是Git 2.23及以上版本才支持的,如果团队里有使用旧版本Git的成员,可能需要先升级。
二、把根目录配置文件移到config目录的可行方案
确实现在很多工具默认把配置文件放在根目录,但几乎所有主流工具都支持自定义配置文件路径,所以完全可以把这些配置移到config目录,只需要做以下适配:
举几个常用工具的配置方法:
.env 文件:用
dotenv包时指定路径,比如在项目入口文件里写:require('dotenv').config({ path: './config/.env' })或者在启动脚本里通过参数指定:
// package.json "scripts": { "start": "node -r dotenv/config app.js dotenv_config_path=./config/.env" }Babel:在构建命令里指定配置文件:
"scripts": { "build": "babel src --out-dir dist --config-file ./config/.babelrc" }ESLint:同时指定配置文件和忽略文件路径:
"scripts": { "lint": "eslint src --config ./config/.eslintrc.json --ignore-path ./config/.eslintignore" }Webpack/Gulp:直接在命令里指定配置文件路径:
"scripts": { "build": "webpack --config ./config/webpack.config.js", "gulp": "gulp --gulpfile ./config/gulpfile.js" }Sequelize:通过命令行参数指定配置文件:
"scripts": { "db:migrate": "sequelize db:migrate --config ./config/sequelize.json" }VSCode:建议保持
.vscode文件夹在根目录,因为它是编辑器的工作区配置,和项目构建配置分开更合理;如果一定要移,可以用符号链接把config目录下的.vscode链接到根目录(Linux/macOS用ln -s ./config/.vscode ./.vscode,Windows用mklink /D .vscode .\config\.vscode)。
总的来说,只要在package.json的scripts里统一配置好各个工具的自定义路径,就能轻松把所有配置文件集中到config目录,让根目录更整洁。
内容的提问来源于stack exchange,提问作者Muhammad Umer

