Configuration
Collection of .gitignore
files
https://github.com/github/gitignore
Large File Storage (LFS)
LFS allows to mix large files within the Git repo without impacting the repo size. These large files are not stored in the Git repo, but in a different location. LFS is widly supported (GitLab, Gitea, GitHub and more).
If you do not upload new files to LFS, just do #1 and #2:
-
Install the Git LFS client on your machine
sudo apt install git-lfs # Ubuntu brew install git-lfs # macOS
-
Clone the repo
git clone ssh://git@....../my-repo cd my-repo git lfs install
-
Mark files to be stored in LFS
git lfs track '*.mp4' git add .gitattributes
-
Upload files to LFS
git add assets/*.mp4 git commit -m 'Add videos' git push
External links
- Visualized Git Commands https://dev.to/lydiahallie/cs-visualized-useful-git-commands-37p1
Mono-repo mono-branch
My expérience:
- 2013 â Architech of three software teams (for a big bank), migrating CVS code to Git repo(s), I was wondering about one repo for different teams
- 2015 â Being the first consultant designing the rewrite of a new matching engine (for a big stock exchange), organizing source code and teams, adopting Agile mindset and many other transformations (coding/commit rules, CI/CD, branching model, dependency/release management, DoDâŠ)
Constraints and learning:
- Le meta projet de lâentreprise a besoin dâĂȘtre dĂ©coupĂ© en micro-projets gĂ©rables par de petites Ă©quipes
- Chaque équipe à des dépendances avec les autres => il faut donc chercher à inciter la collaboration entre les équipes
- Devoir synchroniser les versions de plusieurs repo de code source est source dâerreur, de frustration => Ne pas perdre de temps avec cette tĂąche
- Ce nâĂ©tait pas une bonne idĂ©e les submodules, trop compliquĂ© pour la majoritĂ© des dĂ©veloppeurs => On passait trop de temps Ă rĂ©gler les mauvaises manips
- On avait un super branching model oĂč chaque Ă©quipe avait apportĂ© sa pierre Ă lâĂ©difice => Au final, on nây voyait pas clair, et des branches Ă©taient oubliĂ©es
After many years practitioning different use cases, my position is Simplicity:
- Tout le monde ne connaĂźt pas Git sur le bout des doigts => Faire au plus simple
- Pour suivre ce que font les autres Ă©quipes => avoir leur code source dans le mĂȘme repo
- Le moins de branches possibles => Pourquoi pas avoir toutes les Ă©quipes sur la branche principale, branches possibles si nĂ©cessaire, Ă©viter les branches qui sâĂ©ternisent
- Les commit rules et Git hooks => Ăa frustre le dĂ©v qui comprend pas pourquoi tel fichier est refusĂ©
- Offrir plutÎt des outils (scripts du Git hook) pour vérifier ses changements avant le commit et faire confiance dans la bonne volonté des dév
- Les messages de commit nâont plus trop dâintĂ©rĂȘt aprĂšs quelques mois => Pas besoin dâinvestir du temps Ă dĂ©couper ses commits (
git add -p
) sauf si câest justifiĂ© - On responsabilise le dĂ©veloppeur, et on blinde le CI pour dĂ©tecter les erreurs
- Frustration des codeurs Ă devoir rĂ©diger des documents sous MS-Office, connaĂźtre lâorganisation des rĂ©pertoires partagĂ©s⊠=> Markdown => Frustration des managers car ne connaissent pas GitLab => GĂ©nĂ©rer la doc Ă partir du MD => Site web => Mettre des liens âEdit this documentâ
Bien sûr, pour des projet sans dépendance, OK pour des repos Git séparés. :+1:
En conclusion, câest Ă©lĂ©gant dâavoir de beaux commits, de belles branches, et plein de petits repos⊠Mais le coĂ»t nâest pas Ă nĂ©gliger : les cerveaux de se concentrent sur dâautres tĂąches qui apportent peu de plus value Ă la finalitĂ© du projet. On passe trop de temps Ă faire de lâorfĂšvrerie au lieu de se concentrer sur le but : livraison => dĂ©ploiement => expĂ©rience des utilisateurs finaux.
Câest pour cela que jâen suis arrivĂ© Ă apprĂ©cier dâavoir plusieurs Ă©quipes partageant un mĂȘme repo et la mĂȘme branche. ConsidĂ©rons les diffĂ©rents contributeurs au projet comme des adultes, laissons les prendre leurs responsabilitĂ©s, plutĂŽt que de leur mettre des rĂšgles frustrantes qui les infantilisent.
Commit
Nice example: https://github.com/tiangolo/fastapi
:memo: Update release notes
:sparkles: Add support for OpenAPI Callbacks (#722)
:loud_sound: Refactor logging (#781)
:speech_balloon: Rephrase handling-errors to remove gender
Useful emojis: https://github.com/carloscuesta/gitmoji
Elegant commit message:
:emoji: Verb summarizing the change (in some words) #123 #456 (optionnal issues)
(blank line)
Optionnal verbose descripption
can use multiple lines
* can use bullet points
* and any *Markdown* `syntax`
- But we not care about perfect commit history
- We care about the current source code status (not about what we did last year)
- Each one is free to commit in the way they want (even poor commit message âWIPâ if team members do not care)
- Each one is free to
git push --force
on their own feature branch - But inform others when you
git push --force
onmaster
đ
Branching
- Simplicity: no unnecessary branches
- Only
master
and temporary feature branches (we may adddevelop
and others in the future) - Delete old branches
- Feature branch is nice for:
- risk of regression
- merge request (you want someone review your changes)
- But new code (new subdirectory) can be commited in progress in the
master
branch (if others do not care) - And if the change is obvious (one commit) you can also do it in
master
branch (review is easy for one commit) - Anyone is free to break these rules: Liberty and happiness is more important than constraints
See also:
- branch
- https://learngitbranching.js.org/