just my 2 cents.
I also have all my dotfiles in GIT repo (in some complex structure) and all dotfiles are written in a “composable” way.
You can have a private repo including secrets, but that might be dangerous, way better is to have secrets in some vault (e.g. hashicorp vault)
I am then able to simply symlink configs as needed for each system and compose them as I need.
That way all my machines have exactly the same configuration…
I also use ansible, so if I load new server, will just run ansible, which will install all I need + sets up my config files. some ansible playbook can also setup my local pc.
this is how structure looks like
.
├── README.md
├── editors
│ ├── nvim
│ │ ├── init.vim_ex_erl_go_html_js_py_rt
│ │ ├── init.vim_ex_js_erl_html
│ │ ├── init.vim_go_js_py_rb_rt_sc
│ │ └── local_init.vim
│ └── vim
│ ├── vimrc.local
│ ├── vimrc_erl_ex_html_js
│ ├── vimrc_ex_go_html_js_php_pl_py_rb
│ ├── vimrc_ex_go_html_js_py_rb_rt_sc
│ ├── vimrc_ex_go_html_js_rb
│ ├── vimrc_ex_go_js_py_rb
│ ├── vimrc_go
│ ├── vimrc_go_html_js_py
│ ├── vimrc_js_html
│ └── vimrc_js_html_php
├── fish
│ ├── aliases
│ │ ├── desktop
│ │ │ ├── archlinux.fish
│ │ │ └── ubuntu.fish
│ │ ├── mac
│ │ │ └── work_aliases.fish
│ │ ├── server
│ │ │ ├── centos.fish
│ │ │ └── ubuntu.fish
│ │ ├── shared
│ │ │ ├── archlinux.fish
│ │ │ ├── centos.fish
│ │ │ ├── global.fish
│ │ │ ├── mac.fish
│ │ │ └── ubuntu.fish
│ │ └── wsl
│ │ └── home_windows10.fish
│ ├── completion
│ │ └── shared
│ │ ├── docker.fish
│ │ └── exercism.fish
│ ├── config
│ │ ├── desktop
│ │ │ ├── archlinux.fish
│ │ │ └── ubuntu.fish
│ │ ├── mac
│ │ │ └── work_config.fish
│ │ ├── server
│ │ │ ├── centos.fish
│ │ │ └── ubuntu.fish
│ │ ├── shared
│ │ │ ├── archlinux.fish
│ │ │ ├── centos.fish
│ │ │ ├── global.fish
│ │ │ ├── mac.fish
│ │ │ └── ubuntu.fish
│ │ ├── specific_machines
│ │ │ ├── xxx_xxxxx_xx.fish
│ │ │ └── xxxx_xxxxx_xx.fish
│ │ └── wsl
│ │ ├── home_windows10.fish
│ │ └── work_windows10.fish
│ ├── functions
│ │ └── shared
│ │ ├── git
│ │ │ ├── ga.fish
│ │ │ ├── gd.fish
│ │ │ ├── gm.fish
│ │ │ ├── gp.fish
│ │ │ ├── gpom.fish
│ │ │ └── gs.fish
│ │ ├── git.fish
│ │ ├── global
│ │ │ ├── add-key.fish
│ │ │ ├── read_confirm.fish
│ │ │ ├── serve.fish
│ │ │ └── timestamp.fish
│ │ ├── global.fish
│ │ ├── go
│ │ │ ├── goglobpath.fish
│ │ │ ├── gopath.fish
│ │ │ └── listgo.fish
│ │ ├── go.fish
│ │ ├── md
│ │ │ ├── mdless.fish
│ │ │ └── rmd.fish
│ │ ├── md.fish
│ │ ├── mssql
│ │ │ ├── mssql_check.fish
│ │ │ ├── mssql_connect.fish
│ │ │ ├── mssql_create.fish
│ │ │ ├── mssql_destroy.fish
│ │ │ ├── mssql_start.fish
│ │ │ └── mssql_stop.fish
│ │ ├── mssql.fish
│ │ ├── npx
│ │ │ └── npx_aliases.fish
│ │ └── npx.fish
│ └── variables
│ └── global.fish
├── other
│ ├── gemrc
│ ├── gitconfig
│ └── screenrc
├── powershell
│ ├── completions
│ │ ├── deno.ps1
│ │ └── rustup.ps1
│ ├── modules <tons of my modules, removed for brevity>
│ │ └── SimpleDockerApps
│ ├── profile.ps1
│ ├── profile_mac.ps1
│ └── profile_parallels_windows.ps1
└── scripts <tons of my scripts, removed for brevity>
└── rl.rb