Sync automat al unul branch pe toate celelalte

Salut.

Dupa cateva ore de incercat diverse m-am gandit c-ar fi mai bine sa cer niste pareri, poate s-a mai lovit cineva de urmatoarea “cerinta”.

Se poate in git sa ai un fisier care nu conteaza cand l-ai modificat, ultimele modificari sa fie valabile peste tot (in orice commit, branch)?

Ex: Sa presupunem ca avem 3 branch-uri numite dev, prod, config.
Branch-ul dev e cu vreo 20 commit-uri in fata lui prod.
Branch-ul config e menit sa schimbi doar anumite fisiere de config (1, 2 fisiere ±, iar aceste fisiere NU vor fi modificate in afara branch-ului config)

Vreau ca atunci cand ma mut pe config si schimb ceva, aceste modificari sa se aplice peste tot. In special in orice branch. De preferat si in orice commit.

Sper si oriunde in timp (gen daca dau checkout pe un commit de acum 3 luni, sa am modificarile facute azi, doar de pe branch-ul config, si asta fara sa mai fac eu rebase/merge sau altceva).

Nu inteleg rostul branch-ului config, poti foarte simplu sa pui .gitignore la toate fisierele de config si dupa sa pui config-urile la deploy sau build pe prod cu un configfile.
Probabil ca nu ai un sistem de CI cu git.

Mai bine ii dai git ignore pe config si pui config-ul pe fiecare environment manual.

Later edit: pe folder-ul de config ma refer. Si asa poti sterge branch-ul config ca nu mai e util.

Ce vrei tu nu cred că se poate automat.

Poți face cherry pick să iei un anumit commit, dar cam la orice merge între config, prod și dev cred că vei avea conflicte periodic.

Eventual, dacă vrei să se facă automat, ai putea folosi hook-ul post-checkout să facă cherry pick.


Cum aș face eu:

1: ai exemple de config în repo:

config/db.conf.sample
config/api-keys.conf.sample

2: config/db.conf și config/api-keys.conf sunt în .gitignore

În acest fel excluzi branch-ul config; exemplele de config vor fi tot timpul sincronizate (la merge între dev->prod sau alte branch-uri->dev)

1 Like

Este considerat un bad practice sa pastram fisierele de configurare in Git. In lumea automatizata, configuratiile masinilor se fac in Puppet, iar valorile efective se manageriaza cu hiera. Motivul cel mai important e legat de securitate, nu de workflow. Separarea responsabilitatilor e al 2lea motiv ca ordin de importanta.

Aici o metoda de a le manageria cu simpu bash script. Sau se poate face un repository separat in care sa fie doar configuratiile, aici un exemplu care foloseste GitLab self hosted. Si John Resig are un articol hands-on pe subiect.

3 Likes