Git-Ρ ΡΠΊΠΈ β ΡΡΠΎ ΠΌΠ°Π»Π΅Π½ΡΠΊΠΈΠ΅ ΡΠΊΡΠΈΠΏΡΡ, ΠΊΠΎΡΠΎΡΡΠ΅ Π·Π°ΠΏΡΡΠΊΠ°ΡΡΡΡ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ ΠΏΡΠΈ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ½Π½ΡΡ Π΄Π΅ΠΉΡΡΠ²ΠΈΡΡ Π² ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΠΈ. Π‘ΡΠ΅Π΄ΠΈ Π½ΠΈΡ Π΅ΡΡΡ ΠΎΠ΄ΠΈΠ½ ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎ Π²Π°ΠΆΠ½ΡΠΉ: pre-commit. ΠΠ½ ΡΡΠ°Π±Π°ΡΡΠ²Π°Π΅Ρ ΠΏΠ΅ΡΠ΅Π΄ ΡΠΎΠ·Π΄Π°Π½ΠΈΠ΅ΠΌ ΠΊΠΎΠΌΠΌΠΈΡΠ° ΠΈ ΡΠΏΠΎΡΠΎΠ±Π΅Π½ ΠΎΡΡΠ°Π½ΠΎΠ²ΠΈΡΡ Π΅Π³ΠΎ, Π΅ΡΠ»ΠΈ ΡΡΠΎ-ΡΠΎ ΠΏΠΎΡΠ»ΠΎ Π½Π΅ ΡΠ°ΠΊ β Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, Π΅ΡΠ»ΠΈ ΡΡ ΡΠ»ΡΡΠ°ΠΉΠ½ΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΠ» Π² ΠΊΠΎΠ΄ API-ΠΊΠ»ΡΡ, Π½Π΅ ΠΎΡΡΠΎΡΠΌΠ°ΡΠΈΡΠΎΠ²Π°Π» Python-ΡΠ°ΠΉΠ» ΠΈΠ»ΠΈ ΠΎΡΡΠ°Π²ΠΈΠ» ΡΠ»Π΅Π΄ ΠΎΡ console.log().
Π ΡΡΠ°ΡΡΠ΅ βDiscussion of the Benefits and Drawbacks of the Git Pre-Commit Hookβ ΠΈΠ½ΠΆΠ΅Π½Π΅Ρ Π₯Π°Π½Π½Π΅Ρ ΠΠΎΠΉΡΠ»ΠΎΡΡ (Hannes Leutloff) ΠΏΠΎΠ΄ΡΠΎΠ±Π½ΠΎ ΡΠ°Π·Π±ΠΈΡΠ°Π΅Ρ ΡΠΈΠ»ΡΠ½ΡΠ΅ ΠΈ ΡΠ»Π°Π±ΡΠ΅ ΡΡΠΎΡΠΎΠ½Ρ ΡΡΠΎΠ³ΠΎ ΠΌΠ΅Ρ Π°Π½ΠΈΠ·ΠΌΠ°. Π― ΠΏΠΎΠΏΡΠΎΠ±ΡΡ Π²Π·Π³Π»ΡΠ½ΡΡΡ Π½Π° ΡΠ΅ΠΌΡ Ρ ΠΏΠΎΠ·ΠΈΡΠΈΠΈ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠ°, ΠΊΠΎΡΠΎΡΡΠΉ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ Ρ ΡΠΊΠΈ Π΅ΠΆΠ΅Π΄Π½Π΅Π²Π½ΠΎ β ΠΈ ΡΡΠΈΡΠ°Π΅Ρ, ΡΡΠΎ ΠΏΡΠΈ ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΠΎΠΉ Π½Π°ΡΡΡΠΎΠΉΠΊΠ΅ ΠΎΠ½ΠΈ ΡΡΠ°Π½ΠΎΠ²ΡΡΡΡ Π½Π΅ ΠΏΠΎΠΌΠ΅Ρ ΠΎΠΉ, Π° ΡΠ°ΡΡΡΡ Β«ΠΈΠ½ΡΠ΅Π»Π»Π΅ΠΊΡΡΠ°Π»ΡΠ½ΠΎΠΉ ΡΠ±ΠΎΡΠΊΠΈΒ» ΠΏΡΠΎΠ΅ΠΊΡΠ°.
π‘οΈ ΠΠ»Π°Π²Π½ΠΎΠ΅ ΠΏΡΠ΅Π΄Π½Π°Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ β Π·Π°ΡΠΈΡΠ° ΠΎΡ ΡΡΠ΅ΡΠ΅ΠΊ
Π‘Π°ΠΌΠ°Ρ ΠΎΡΠ΅Π²ΠΈΠ΄Π½Π°Ρ ΠΏΠΎΠ»ΡΠ·Π° pre-commit β ΡΡΠΎ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡΡ. ΠΠ½ β ΠΏΠΎΡΠ»Π΅Π΄Π½ΡΡ Π»ΠΈΠ½ΠΈΡ ΠΎΠ±ΠΎΡΠΎΠ½Ρ ΠΏΠ΅ΡΠ΅Π΄ ΠΏΠΎΠΏΠ°Π΄Π°Π½ΠΈΠ΅ΠΌ Π΄Π°Π½Π½ΡΡ
Π² Git-ΠΈΡΡΠΎΡΠΈΡ.
ΠΠ°ΠΆΠ΅ Π΅ΡΠ»ΠΈ Ρ ΡΠ΅Π±Ρ ΡΡΠΎΠΈΡ .gitignore, ΡΠ»ΡΡΠ°ΠΉΠ½ΠΎ Π·Π°ΠΊΠΎΠΌΠΌΠΈΡΠΈΡΡ config.yaml Ρ ΡΠΎΠΊΠ΅Π½ΠΎΠΌ OpenAI ΠΈΠ»ΠΈ ΠΏΡΠΈΠ²Π°ΡΠ½ΡΠΉ SSH-ΠΊΠ»ΡΡ ΠΏΡΠΎΡΠ΅, ΡΠ΅ΠΌ ΠΊΠ°ΠΆΠ΅ΡΡΡ.
π΅οΈ ΠΠ»Ρ ΡΡΠΎΠ³ΠΎ ΡΡΡΠ΅ΡΡΠ²ΡΡΡ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΡ Π²ΡΠΎΠ΄Π΅ Gitleaks, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΈΠ½ΡΠ΅Π³ΡΠΈΡΡΡΡΡΡ Ρ pre-commit ΠΈ ΡΠΊΠ°Π½ΠΈΡΡΡΡ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ Π½Π° ΠΏΡΠ΅Π΄ΠΌΠ΅Ρ ΡΠ΅ΠΊΡΠ΅ΡΠΎΠ² (ΠΏΠΎ ΡΠ΅Π³ΡΠ»ΡΡΠΊΠ°ΠΌ, ΠΏΡΠ΅ΡΠΈΠΊΡΠ°ΠΌ, ΠΏΠ°ΡΡΠ΅ΡΠ½Π°ΠΌ ΡΠΎΠΊΠ΅Π½ΠΎΠ² AWS, GitHub ΠΈ Ρ.Π΄.).
β‘ Π Π°Π±ΠΎΡΠ°ΡΡ ΠΎΠ½ΠΈ Π±ΡΡΡΡΠΎ ΠΈ ΠΏΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈ Π½Π΅ ΠΌΠ΅ΡΠ°ΡΡ ΠΏΠΎΡΠΎΠΊΡ ΡΠ°Π±ΠΎΡΡ, ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎ Π΅ΡΠ»ΠΈ ΠΎΠ³ΡΠ°Π½ΠΈΡΠΈΡΡ ΠΏΡΠΎΠ²Π΅ΡΠΊΡ ΡΠΎΠ»ΡΠΊΠΎ ΠΈΠ·ΠΌΠ΅Π½ΡΠ½Π½ΡΡ ΡΠ°ΠΉΠ»ΠΎΠ² (--staged).
π‘ ΠΠΎΠΉ ΠΎΠΏΡΡ: Π΄ΠΎΠ±Π°Π²ΠΈΠ² Gitleaks Π² pre-commit, Ρ ΠΎΠ΄Π½Π°ΠΆΠ΄Ρ Β«ΡΠΏΠ°ΡΒ» ΠΊΠΎΠ»Π»Π΅Π³Ρ ΠΎΡ ΡΠ»ΡΡΠ°ΠΉΠ½ΠΎΠΉ ΠΏΡΠ±Π»ΠΈΠΊΠ°ΡΠΈΠΈ ΠΊΠΎΡΠΏΠΎΡΠ°ΡΠΈΠ²Π½ΠΎΠ³ΠΎ ΡΠΎΠΊΠ΅Π½Π° Π² ΠΎΡΠΊΡΡΡΠΎΠΌ ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΠΈ. ΠΠ΅Π· Π½Π΅Π³ΠΎ ΠΏΡΠΈΡΠ»ΠΎΡΡ Π±Ρ Π΄Π΅Π»Π°ΡΡ git filter-repo ΠΈ ΠΏΠ΅ΡΠ΅ΠΏΠΈΡΡΠ²Π°ΡΡ ΠΈΡΡΠΎΡΠΈΡ.
π¨ Π€ΠΎΡΠΌΠ°ΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΠΈ Π»ΠΈΠ½ΡΠΈΠ½Π³ β Π±ΡΡΡΡΠΎ ΠΈ Π±Π΅Π· Π±ΠΎΠ»ΠΈ
Π‘Π»Π΅Π΄ΡΡΡΠΈΠΉ ΡΠ°ΡΡΡΠΉ ΠΊΠ΅ΠΉΡ β Π°Π²ΡΠΎΡΠΎΡΠΌΠ°ΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΠΈ Π»ΡΠ³ΠΊΠΈΠΉ Π»ΠΈΠ½ΡΠΈΠ½Π³.
ΠΠ½ΡΡΡΡΠΌΠ΅Π½ΡΡ Π²ΡΠΎΠ΄Π΅ black, isort, eslint --fix, prettier ΠΈΠ»ΠΈ nixfmt ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΏΡΡΠΊΠ°ΡΡ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ ΠΏΡΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΠΊΠΎΠΌΠΌΠΈΡΠ΅.
π§° ΠΡΠΎ ΡΠΊΠΎΠ½ΠΎΠΌΠΈΡ Π²ΡΠ΅ΠΌΡ ΠΈ Π½Π΅ΡΠ²Ρ:
- πͺ ΠΠΎΠ΄ Π²ΡΠ΅Π³Π΄Π° Π² ΠΎΠ΄Π½ΠΎΠΌ ΡΡΠΈΠ»Π΅, Π±Π΅Π· ΡΠΏΠΎΡΠΎΠ² Β«Π³Π΄Π΅ ΡΡΠ°Π²ΠΈΡΡ Π·Π°ΠΏΡΡΡΡΒ».
- π CI Π½Π΅ ΠΏΠ°Π΄Π°Π΅Ρ ΠΈΠ·-Π·Π° Π΅ΡΡΠ½Π΄Ρ, Π²Π΅Π΄Ρ ΡΠΎΡΠΌΠ°ΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΠΈΡΠΏΡΠ°Π²Π»ΡΠ΅ΡΡΡ Π΄ΠΎ ΠΏΡΡΠ°.
- π¬ ΠΠ΅Π½ΡΡΠ΅ Π»ΠΈΡΠ½ΠΈΡ Π΄ΠΈΡΡΠΎΠ² Π² PR, ΡΠ°ΠΊ ΠΊΠ°ΠΊ Π²ΡΠ΅ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡ ΠΎΠ΄Π½ΠΈ ΠΈ ΡΠ΅ ΠΆΠ΅ ΠΏΡΠ°Π²ΠΈΠ»Π°.
ΠΠΎ Π²Π°ΠΆΠ½ΠΎ ΠΏΠΎΠΌΠ½ΠΈΡΡ: ΡΠ΅ΠΌ Π±ΠΎΠ»ΡΡΠ΅ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠΎΠ² ΡΡ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ°Π΅ΡΡ, ΡΠ΅ΠΌ ΠΌΠ΅Π΄Π»Π΅Π½Π½Π΅Π΅ Π±ΡΠ΄Π΅Ρ ΠΊΠΎΠΌΠΌΠΈΡ.
π Π Π΅ΠΊΠΎΠΌΠ΅Π½Π΄Π°ΡΠΈΡ ΠΠΎΠΉΡΠ»ΠΎΡΡΠ°:
ΠΎΡΡΠ°Π²Π»ΡΠΉ Π² pre-commit ΡΠΎΠ»ΡΠΊΠΎ ΠΌΠ³Π½ΠΎΠ²Π΅Π½Π½ΡΠ΅ ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ (ΡΠΎΡΠΌΠ°ΡΡΠ΅ΡΡ, Π»ΡΠ³ΠΊΠΈΠ΅ Π»ΠΈΠ½ΡΠ΅ΡΡ),
Π° ΡΠ΅ΡΡΡ ΠΈ ΡΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΠΉ Π°Π½Π°Π»ΠΈΠ· β ΠΏΡΡΡΡ Π²ΡΠΏΠΎΠ»Π½ΡΡΡΡΡ Π² CI.
π ΠΠΎΠ³Π΄Π° pre-commit Π½Π°ΡΠΈΠ½Π°Π΅Ρ ΡΠ°Π·Π΄ΡΠ°ΠΆΠ°ΡΡ
ΠΡΠΎΠ±Π»Π΅ΠΌΡ Π½Π°ΡΠΈΠ½Π°ΡΡΡΡ, ΠΊΠΎΠ³Π΄Π° ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊ Π΄Π΅Π»Π°Π΅Ρ Π΄Π΅ΡΡΡΠΊΠΈ ΠΊΠΎΠΌΠΌΠΈΡΠΎΠ² Π² Π΄Π΅Π½Ρ β Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΡΠΈΠΊΡΠΈΡ Π²Π΅ΡΡΡΠΊΡ ΠΈΠ»ΠΈ ΡΠ΅ΡΡΠΈΡΡΠ΅Ρ Π»ΠΎΠ³ΠΈΠΊΡ. ΠΡΠ»ΠΈ ΠΊΠ°ΠΆΠ΄ΡΠΉ ΠΊΠΎΠΌΠΌΠΈΡ ΠΆΠ΄ΡΡ ΠΏΠΎΠ»ΠΌΠΈΠ½ΡΡΡ, ΡΠΎ Π΄Π°ΠΆΠ΅ ΠΈΠ΄Π΅Π°Π»ΡΠ½ΡΠΉ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½Ρ ΠΏΡΠ΅Π²ΡΠ°ΡΠ°Π΅ΡΡΡ Π² Π±ΡΡΠΎΠΊΡΠ°ΡΠΈΡ.
π§± ΠΡΠΎΠ±Π»Π΅ΠΌΡ, Ρ ΠΊΠΎΡΠΎΡΡΠΌΠΈ ΡΡΠ°Π»ΠΊΠΈΠ²Π°ΡΡΡΡ ΠΊΠΎΠΌΠ°Π½Π΄Ρ:
- β³ Π΄ΠΎΠ»Π³Π°Ρ ΠΏΡΠΎΠ²Π΅ΡΠΊΠ° Π»ΠΈΠ½ΡΠ΅ΡΠΎΠ² ΠΈ ΡΠ΅ΡΡΠΎΠ²;
- π« Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ ΡΠ΄Π΅Π»Π°ΡΡ ΡΠ΅ΡΠ½ΠΎΠ²ΠΎΠΉ (Β«work in progressΒ») ΠΊΠΎΠΌΠΌΠΈΡ;
- π ΠΏΡΠΈΠ²ΡΡΠΊΠ° Β«ΠΎΡΠΊΠ»ΡΡΠ°ΡΡ Ρ ΡΠΊΠΈΒ» ΡΠ΅ΡΠ΅Π· --no-verify.
βοΈ Π Π΅ΡΠ΅Π½ΠΈΠ΅ β Π±Π°Π»Π°Π½Ρ:
ΠΎΡΡΠ°Π²Ρ ΡΠΎΠ»ΡΠΊΠΎ ΡΠ°ΠΌΡΠ΅ Π±ΡΡΡΡΡΠ΅ ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ,
Π° Π²ΡΡ ΠΎΡΡΠ°Π»ΡΠ½ΠΎΠ΅ β Π²ΡΠ½ΠΎΡΠΈ Π½Π° push ΠΈΠ»ΠΈ CI.
πΌ ΠΡΠΎΡΡΠ°Ρ ΡΡΡΠ°Π½ΠΎΠ²ΠΊΠ° β Π·Π°Π»ΠΎΠ³ ΡΡΠΏΠ΅Ρ Π°
Π₯ΡΠΊΠΈ Π½Π΅ ΠΏΠΎΠΏΠ°Π΄Π°ΡΡ Π² ΡΠ°ΠΌ Git-ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΠΉ β ΠΏΠ°ΠΏΠΊΠ° .git/hooks Π½Π΅ ΠΎΡΡΠ»Π΅ΠΆΠΈΠ²Π°Π΅ΡΡΡ ΡΠΈΡΡΠ΅ΠΌΠΎΠΉ ΠΊΠΎΠ½ΡΡΠΎΠ»Ρ Π²Π΅ΡΡΠΈΠΉ. ΠΠΎΡΡΠΎΠΌΡ Π½ΠΎΠ²ΠΈΡΠΊΠ°ΠΌ Π½ΡΠΆΠ½ΠΎ ΠΎΡΠ΄Π΅Π»ΡΠ½ΠΎ ΠΈΡ ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°ΡΡ.
Π§ΡΠΎΠ±Ρ ΡΡΠΎ Π½Π΅ ΠΏΡΠ΅Π²ΡΠ°ΡΠΈΠ»ΠΎΡΡ Π² Π±ΠΎΠ»Ρ, ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π³ΠΎΡΠΎΠ²ΡΠ΅ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΡ:
π§© Pre-Commit β ΠΏΠΎΠΏΡΠ»ΡΡΠ½ΡΠΉ ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ Ρ
ΡΠΊΠΎΠ² Π½Π° Python.
ΠΠ½ Ρ
ΡΠ°Π½ΠΈΡ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ Π² .pre-commit-config.yaml, ΡΠΌΠ΅Π΅Ρ ΠΏΠΎΠ΄ΡΡΠ³ΠΈΠ²Π°ΡΡ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ ΠΈ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°ΡΡ Π½ΡΠΆΠ½ΡΠ΅ Π²Π΅ΡΡΠΈΠΈ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠΎΠ².
π¦ Prek β ΠΏΠ΅ΡΠ΅ΠΏΠΈΡΠ°Π½Π½Π°Ρ Π½Π° Rust Π²Π΅ΡΡΠΈΡ Pre-Commit, Π΅ΡΡ Π² ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠ΅, Π½ΠΎ Π±ΡΡΡΡΠ°Ρ.
π³ Husky β Π²Π°ΡΠΈΠ°Π½Ρ Π΄Π»Ρ JavaScript/TypeScript-ΠΏΡΠΎΠ΅ΠΊΡΠΎΠ² (ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅ΡΡΡ ΡΠ΅ΡΠ΅Π· npm).
π§ββοΈ Π Π°Π²ΡΠΎΡ ΡΡΠ°ΡΡΠΈ ΡΠΎΠ²Π΅ΡΡΠ΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ devenv (Π½Π° Π±Π°Π·Π΅ Nix) β ΡΠΈΡΡΠ΅ΠΌΡ Π΄Π»Ρ ΠΎΠΏΠΈΡΠ°Π½ΠΈΡ ΠΎΠΊΡΡΠΆΠ΅Π½ΠΈΠΉ, Π³Π΄Π΅ pre-commit Π½Π°ΡΡΡΠ°ΠΈΠ²Π°Π΅ΡΡΡ ΡΠ΅Π½ΡΡΠ°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π½ΠΎ.
ΠΠΎΠΌΠ°Π½Π΄Π° devenv test ΠΌΠΎΠΆΠ΅Ρ Π·Π°ΠΏΡΡΠΊΠ°ΡΡ Π²ΡΠ΅ ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ ΡΡΠ°Π·Ρ, Π²ΠΊΠ»ΡΡΠ°Ρ Ρ
ΡΠΊΠΈ, ΡΡΠΎ ΡΠ΄ΠΎΠ±Π½ΠΎ Π΄Π»Ρ CI/CD.
π§ ΠΠΎΠΉ Π²Π·Π³Π»ΡΠ΄: pre-commit β ΠΊΠ°ΠΊ IDE Π²ΡΠΎΡΠΎΠ³ΠΎ ΡΡΠΎΠ²Π½Ρ
Π‘ΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅ Ρ
ΡΠΊΠΈ Π²ΡΡ Π±ΠΎΠ»ΡΡΠ΅ Π½Π°ΠΏΠΎΠΌΠΈΠ½Π°ΡΡ Β«Π²ΡΡΡΠΎΠ΅Π½Π½ΠΎΠ³ΠΎ Π°ΡΡΠΈΡΡΠ΅Π½ΡΠ°Β» β ΠΎΠ½ΠΈ Π½Π΅ ΠΏΡΠΎΡΡΠΎ ΠΏΡΠΎΠ²Π΅ΡΡΡΡ ΠΊΠΎΠ΄, Π° Π΄Π΅Π»Π°ΡΡ Π΅Π³ΠΎ ΡΠ°ΠΌΠΎΠΎΡΠΈΡΠ°ΡΡΠΈΠΌΡΡ.
Π― Π±Ρ ΡΡΠ°Π²Π½ΠΈΠ» ΠΈΡ
Ρ Π²ΡΠΎΡΡΠΌ ΡΡΠΎΠ²Π½Π΅ΠΌ IDE: Π΅ΡΠ»ΠΈ IDE ΠΏΠΎΠ΄ΡΠΊΠ°Π·ΡΠ²Π°Π΅Ρ ΡΠ΅Π±Π΅, ΡΡΠΎ Π½Π΅ ΡΠ°ΠΊ, ΡΠΎ pre-commit Π³Π°ΡΠ°Π½ΡΠΈΡΡΠ΅Ρ, ΡΡΠΎ ΠΎΡΠΈΠ±ΠΊΠ° Π½Π΅ ΠΏΠΎΠΏΠ°Π΄ΡΡ Π² ΠΈΡΡΠΎΡΠΈΡ.
π€ ΠΡΠΎΠ±Π΅Π½Π½ΠΎ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ½ΠΎ Π²ΡΠ³Π»ΡΠ΄ΠΈΡ ΠΈΠ΄Π΅Ρ ΠΈΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΠΈ Ρ ΠΠ:
Π² Π±ΡΠ΄ΡΡΠ΅ΠΌ pre-commit ΠΌΠΎΠΆΠ΅Ρ Π½Π΅ ΠΏΡΠΎΡΡΠΎ Π»ΠΈΠ½ΡΠΈΡΡ, Π° ΠΎΠ±ΡΡΡΠ½ΡΡΡ, ΠΏΠΎΡΠ΅ΠΌΡ ΡΠ²ΠΎΠΉ ΠΊΡΡΠΎΠΊ ΠΊΠΎΠ΄Π° ΠΏΠΎΡΠ΅Π½ΡΠΈΠ°Π»ΡΠ½ΠΎ ΠΎΠΏΠ°ΡΠ΅Π½ ΠΈΠ»ΠΈ Π½Π΅ΡΡΡΠ΅ΠΊΡΠΈΠ²Π΅Π½.
ΠΡΠ΅Π΄ΡΡΠ°Π²Ρ: Git ΠΎΡΠΊΠ»ΠΎΠ½ΡΠ΅Ρ ΠΊΠΎΠΌΠΌΠΈΡ ΠΈ ΠΏΠΈΡΠ΅Ρ β
Β«π¨ ΠΠΎΠ·ΠΌΠΎΠΆΠ½Π° ΡΡΠ΅ΡΠΊΠ° ΡΠΎΠΊΠ΅Π½Π° Π² ΡΡΡΠΎΠΊΠ΅ 42. ΠΡΠ΅Π΄Π»Π°Π³Π°Ρ Π·Π°ΠΌΠ΅Π½ΠΈΡΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ Π½Π° ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ ΠΎΠΊΡΡΠΆΠ΅Π½ΠΈΡ ΠΈ ΠΎΠ±Π½ΠΎΠ²ΠΈΡΡ .env.example.Β»
Π’Π°ΠΊΠΈΠ΅ Β«ΡΠΌΠ½ΡΠ΅Β» Ρ ΡΠΊΠΈ ΠΏΡΠ΅Π²ΡΠ°ΡΡΡ Git ΠΈΠ· ΡΡΠ°ΡΠΈΡΠ½ΠΎΠ³ΠΎ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠ° Π² ΠΏΠ°ΡΡΠ½ΡΡΠ° ΠΏΠΎ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡΠΈ ΠΈ ΠΊΠ°ΡΠ΅ΡΡΠ²Ρ.
π§Ύ ΠΡΠ²ΠΎΠ΄
Π₯ΡΠΊ pre-commit β Π½Π΅ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½Ρ ΠΊΠΎΠ½ΡΡΠΎΠ»Ρ, Π° ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½Ρ Π΄ΠΎΠ²Π΅ΡΠΈΡ. ΠΠ½ ΠΏΠΎΠΌΠΎΠ³Π°Π΅Ρ ΡΠ΄Π΅Π»Π°ΡΡ ΠΊΠΎΠ΄ ΡΠΈΡΠ΅, ΠΈΡΡΠΎΡΠΈΡ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½Π΅Π΅, Π° ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΡ β ΡΠΏΠΎΠΊΠΎΠΉΠ½Π΅Π΅. ΠΠ»Π°Π²Π½ΠΎΠ΅ β Π΄Π΅ΡΠΆΠ°ΡΡ Π΅Π³ΠΎ Π±ΡΡΡΡΡΠΌ, ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΠΈΡΡΠΈΡΠ½ΡΠΌ ΠΈ ΠΏΡΠ΅Π΄ΡΠΊΠ°Π·ΡΠ΅ΠΌΡΠΌ.
π§ ΠΠΏΡΠΈΠΌΠ°Π»ΡΠ½ΡΠΉ Π½Π°Π±ΠΎΡ Ρ
ΡΠΊΠΎΠ²:
π ΠΏΡΠΎΠ²Π΅ΡΠΊΠ° ΡΠ΅ΠΊΡΠ΅ΡΠΎΠ² (Gitleaks);
π¨ Π°Π²ΡΠΎΡΠΎΡΠΌΠ°ΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ (black, prettier, nixfmt);
β‘ Π»ΡΠ³ΠΊΠΈΠ΅ Π»ΠΈΠ½ΡΠ΅ΡΡ (ruff, eslint --fix).
Π Π²ΡΡ, ΡΡΠΎ ΠΌΠΎΠΆΠ΅Ρ ΠΌΠ΅ΡΠ°ΡΡ ΠΏΠΎΡΠΎΠΊΡ β ΡΠ΅ΡΡΡ, ΡΠ±ΠΎΡΠΊΠ°, Π°Π½Π°Π»ΠΈΠ·Π°ΡΠΎΡΡ β ΠΏΡΡΡΡ ΠΆΠΈΠ²ΡΡ Π² CI.
π ΠΡΡΠΎΡΠ½ΠΈΠΊΠΈ ΠΈ ΡΡΡΠ»ΠΊΠΈ:
- π° ΠΡΠΈΠ³ΠΈΠ½Π°Π»ΡΠ½Π°Ρ ΡΡΠ°ΡΡΡ: Discussion of the Benefits and Drawbacks of the Git Pre-Commit Hook β yeldirium.de, 2025
- π§° Gitleaks GitHub