π ΠΠ°ΡΠ΅Π³ΠΎΡΠΈΡ: DevOps Essentials
π‘ Π¦Π΅Π»Ρ: ΠΡΠ΅Π²ΡΠ°ΡΠΈΡΡ Ρ
Π°ΠΎΡΠΈΡΠ½ΡΡ ΠΈΡΡΠΎΡΠΈΡ ΠΊΠΎΠΌΠΌΠΈΡΠΎΠ² Π² ΠΏΡΠΎΡΠ΅ΡΡΠΈΠΎΠ½Π°Π»ΡΠ½ΡΠΉ ΡΡΠ°Π½Π΄Π°ΡΡ ΠΊΠΎΠΌΠ°Π½Π΄Ρ
β±οΈ ΠΡΠ΅ΠΌΡ: ~2-3 ΡΠ°ΡΠ° ΠΏΡΠ°ΠΊΡΠΈΠΊΠΈ
π― Π§Π΅ΠΌΡ Π²Ρ Π½Π°ΡΡΠΈΡΠ΅ΡΡ
- ΠΠΈΠ°Π³Π½ΠΎΡΡΠΈΡΠΎΠ²Π°ΡΡ ΡΡΠ΅ΡΠ± ΠΎΡ Ρ Π°ΠΎΡΠΈΡΠ½ΡΡ ΠΊΠΎΠΌΠΌΠΈΡΠΎΠ² Π² ΡΠ΅Π°Π»ΡΠ½ΡΡ ΠΏΡΠΎΠ΅ΠΊΡΠ°Ρ
- ΠΡΠΈΠΌΠ΅Π½ΡΡΡ ΡΡΠ°Π½Π΄Π°ΡΡ Conventional Commits Π΄Π»Ρ ΡΡΡΡΠΊΡΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ
- ΠΠ²ΡΠΎΠΌΠ°ΡΠΈΠ·ΠΈΡΠΎΠ²Π°ΡΡ Π²Π°Π»ΠΈΠ΄Π°ΡΠΈΡ ΠΊΠΎΠΌΠΌΠΈΡΠΎΠ² Ρ Husky + Commitlint
- ΠΠ·ΠΌΠ΅ΡΡΡΡ ΠΊΠ°ΡΠ΅ΡΡΠ²ΠΎ ΠΈΡΡΠΎΡΠΈΠΈ Git Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΠΌΠ΅ΡΡΠΈΠΊ
- ΠΠ½Π΅Π΄ΡΡΡΡ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΡΠ΅ ΡΡΠ°Π½Π΄Π°ΡΡΡ Π΄Π»Ρ Π½ΠΎΠ²ΡΡ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΎΠ²
β οΈ ΠΡΠΈΡΠΈΡΠ½ΠΎ ΠΏΠ΅ΡΠ΅Π΄ ΡΡΠ°ΡΡΠΎΠΌ
- ΠΠ°ΠΊΡΠΎΠΉΡΠ΅ Π²ΡΠ΅ ΡΠ΅ΡΠΌΠΈΠ½Π°Π»Ρ (Π½ΡΠΆΠ΅Π½ ΡΠΈΡΡΡΠΉ ΡΠ΅Π°Π½Ρ)
- ΠΡΠΎΠ²Π΅ΡΡΡΠ΅ ΡΠ΅ΠΊΡΡΠΈΠ΅ Π½Π°ΡΡΡΠΎΠΉΠΊΠΈ Git:
git config --list | grep user
- Π‘ΠΎΠ·Π΄Π°ΠΉΡΠ΅ ΡΠ΅Π·Π΅ΡΠ²Π½ΡΡ ΠΊΠΎΠΏΠΈΡ ΡΡΡΠ΅ΡΡΠ²ΡΡΡΠΈΡ ΠΏΡΠΎΠ΅ΠΊΡΠΎΠ²
π₯ ΠΠ ΠΠΠ’ΠΠΠ 1: Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΡ
Π¨Π°Π³ 1: ΠΠΌΠΈΡΠΈΡΡΠ΅ΠΌ ΡΠ΅Π°Π»ΡΠ½ΡΠΉ Ρ Π°ΠΎΡ
ΠΡΠΏΠΎΠ»Π½ΠΈΡΠ΅ ΡΡΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Ρ Π΄Π»Ρ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ Π΄Π΅ΠΌΠΎ-ΠΏΡΠΎΠ΅ΠΊΡΠ° Ρ ΠΏΠ»ΠΎΡ ΠΈΠΌΠΈ ΠΊΠΎΠΌΠΌΠΈΡΠ°ΠΌΠΈ:
# Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ Π΄Π΅ΠΌΠΎ ΠΏΡΠΎΠ΅ΠΊΡ Ρ ΠΏΠ»ΠΎΡ
ΠΈΠΌΠΈ ΠΊΠΎΠΌΠΌΠΈΡΠ°ΠΌΠΈ (ΠΊΠ°ΠΊ Π² ΡΠ΅Π°Π»ΡΠ½ΡΡ
Π±Π°Π½ΠΊΠ°Ρ
)
mkdir chaos-banking-app && cd chaos-banking-app
git init
# Π‘ΠΈΠΌΡΠ»ΠΈΡΡΠ΅ΠΌ ΡΠΈΠΏΠΈΡΠ½ΡΡ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΡ Π±Π°Π½ΠΊΠΎΠ²ΡΠΊΠΎΠ³ΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ
echo "// Π‘ΠΈΡΡΠ΅ΠΌΠ° Π°ΡΡΠ΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΈΠΈ Π±Π°Π½ΠΊΠ°" > auth.js
echo "const express = require('express');" > server.js
git add . && git commit -m "fix"
echo "// ΠΠ°Π»ΠΈΠ΄Π°ΡΠΈΡ JWT ΡΠΎΠΊΠ΅Π½Π°" >> auth.js
echo "// ΠΡΠΈΡΠΈΡΠ΅ΡΠΊΠΎΠ΅ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡΠΈ" >> auth.js
echo "app.listen(3000);" >> server.js
echo "const db = require('./db');" > database.js
git add . && git commit -m "update"
echo "// TODO: ΠΈΡΠΏΡΠ°Π²ΠΈΡΡ ΡΡΠΎ ΠΏΠΎΠ·ΠΆΠ΅" >> auth.js
echo "console.log('DEBUG: Π΄Π°Π½Π½ΡΠ΅ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ', userData);" >> auth.js
echo "// ΠΠΊΡΡΡΠ΅Π½Π½ΠΎΠ΅ ΠΈΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ Π΄Π»Ρ ΠΏΡΠΎΠ΄Π°ΠΊΡΠ½Π°" >> database.js
git add . && git commit -m "asdf"
echo "module.exports = auth;" >> auth.js
echo "// ΠΠ°ΡΡ ΡΡΠ·Π²ΠΈΠΌΠΎΡΡΠΈ CVE-2023-1234" >> auth.js
echo "// ΠΠΎΠ²Π°Ρ ΡΡΠ½ΠΊΡΠΈΡ: ΡΠΎΠ»ΠΈ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Π΅ΠΉ" >> database.js
echo "// ΠΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ Π΄Π»Ρ ΡΠ°Π·Π²Π΅ΡΡΡΠ²Π°Π½ΠΈΡ" > config.js
git add . && git commit -m "stuff"
echo "// ΠΡΡΡΡΠΎΠ΅ ΠΈΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ ΠΏΠ΅ΡΠ΅Π΄ Π΄Π΅ΠΌΠΎ" >> server.js
echo "// Π Π΅ΡΠ°ΠΊΡΠΎΡΠΈΠ½Π³ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΠΎΠ³ΠΎ ΡΠ΅ΡΠ²ΠΈΡΠ°" >> database.js
git add . && git commit -m "tmp commit"
echo "// Π€ΠΈΠ½Π°Π»ΡΠ½ΡΠ΅ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ ΠΏΠ΅ΡΠ΅Π΄ ΡΠ΅Π»ΠΈΠ·ΠΎΠΌ" >> config.js
echo "// ΠΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΡ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΠΈ" >> server.js
echo "// ΠΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ Π±Π°Π³Π° Π² Π°ΡΡΠ΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΈΠΈ" >> auth.js
git add . && git commit -m "final"
Π¨Π°Π³ 2: ΠΠ½Π°Π»ΠΈΠ·ΠΈΡΡΠ΅ΠΌ ΡΠΎΠ·Π΄Π°Π½Π½ΡΠΉ Π±Π΅ΡΠΏΠΎΡΡΠ΄ΠΎΠΊ
ΠΠΎΡΠΌΠΎΡΡΠΈΠΌ Π½Π° ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ Ρ Π°ΠΎΡΠ°:
# Π‘ΠΌΠΎΡΡΠΈΠΌ Π½Π° Ρ
Π°ΠΎΡΠΈΡΠ½ΡΡ ΠΈΡΡΠΎΡΠΈΡ
git log --oneline
# Π Π΅Π·ΡΠ»ΡΡΠ°Ρ ΠΊΠ°ΡΠ°ΡΡΡΠΎΡΡ:
# 7f8e9d2 final
# 6a7b8c3 tmp commit
# 5d4e3f2 stuff
# 4c3d2e1 asdf
# 3b2c1d0 update
# 2a1b0c9 fix
# ΠΠ½Π°Π»ΠΈΠ·ΠΈΡΡΠ΅ΠΌ ΡΠΎΠ΄Π΅ΡΠΆΠΈΠΌΠΎΠ΅ ΠΊΠΎΠΌΠΌΠΈΡΠΎΠ²
git show --stat HEAD~5 # Π§ΡΠΎ ΡΠΊΡΡΠ²Π°Π΅ΡΡΡ Π² ΠΊΠΎΠΌΠΌΠΈΡΠ΅ "fix"?
git show --stat HEAD~4 # Π ΡΡΠΎ Π² "update"?
echo "π ΠΠ΅ΠΌΠΎΠ½ΡΡΡΠΈΡΡΠ΅ΠΌ Ρ
Π°ΠΎΡΠΈΡΠ½ΡΡ ΠΈΡΡΠΎΡΠΈΡ:"
git log --oneline -6
echo ""
echo "π Π§ΡΠΎ ΡΠΎΠ΄Π΅ΡΠΆΠ°Ρ 'ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠ²Π½ΡΠ΅' ΠΊΠΎΠΌΠΌΠΈΡΡ:"
echo "ΠΠΎΠΌΠΌΠΈΡ 'fix':"
git show --name-only HEAD~5 | tail -n +6
echo ""
echo "ΠΠΎΠΌΠΌΠΈΡ 'update':"
git show --name-only HEAD~4 | tail -n +6
echo ""
echo "π ΠΠ΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ½ΡΡΡ, ΡΡΠΎ ΠΈΠ·ΠΌΠ΅Π½ΠΈΠ»ΠΎΡΡ ΠΈ Π·Π°ΡΠ΅ΠΌ!"
π ΠΠ·ΠΌΠ΅ΡΡΠ΅ΠΌ ΡΠ΅Π°Π»ΡΠ½ΡΠΉ ΡΡΠ΅ΡΠ±
Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½Ρ Π΄ΠΈΠ°Π³Π½ΠΎΡΡΠΈΠΊΠΈ Π΄Π»Ρ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²Π΅Π½Π½ΠΎΠΉ ΠΎΡΠ΅Π½ΠΊΠΈ ΠΏΡΠΎΠ±Π»Π΅ΠΌ:
cat << 'EOF' > analyze-chaos.sh
#!/bin/bash
echo "π ΠΠΠΠΠΠ Π₯ΠΠΠ’ΠΠ§ΠΠ«Π₯ ΠΠΠΠΠΠ’ΠΠ"
echo "================================"
echo "1. ΠΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ Π±Π΅ΡΡΠΌΡΡΠ»Π΅Π½Π½ΡΡ
ΠΊΠΎΠΌΠΌΠΈΡΠΎΠ²:"
git log --oneline | grep -E "(fix|update|tmp|asdf|stuff)" | wc -l
echo "2. ΠΠΎΠΌΠΌΠΈΡΡ Π±Π΅Π· ΡΠ²ΡΠ·ΠΈ Ρ Π·Π°Π΄Π°ΡΠ°ΠΌΠΈ:"
git log --oneline | grep -v -E "feat|fix|docs|style|refactor|test|chore" | wc -l
echo "3. Π‘ΡΠ΅Π΄Π½ΠΈΠΉ ΡΠ°Π·ΠΌΠ΅Ρ ΠΊΠΎΠΌΠΌΠΈΡΠ° (ΡΠ°ΠΉΠ»ΠΎΠ²):"
FILES_TOTAL=$(git log --pretty=format: --name-only | grep -v '^$' | wc -l)
COMMITS_TOTAL=$(git rev-list --count HEAD)
if [ $COMMITS_TOTAL -gt 0 ]; then
echo "scale=2; $FILES_TOTAL / $COMMITS_TOTAL" | bc 2>/dev/null || echo "$((FILES_TOTAL / COMMITS_TOTAL))"
else
echo "0"
fi
echo ""
echo "π ΠΠΠ‘ΠΠΠΠ‘Π’ΠΠΠ―:"
echo "- ΠΡΠ΅ΠΌΡ ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ ΠΊΠΎΠ΄Π°: +200% (45 ΠΌΠΈΠ½ Π²ΠΌΠ΅ΡΡΠΎ 15)"
echo "- ΠΡΡΠ΅ΠΊΡΠΈΠ²Π½ΠΎΡΡΡ git bisect: 20% Π²ΠΌΠ΅ΡΡΠΎ 95%"
echo "- Π‘Π»ΠΎΠΆΠ½ΠΎΡΡΡ ΠΎΡΠΊΠ°ΡΠ°: ΠΠ ΠΠ’ΠΠ§ΠΠ"
echo "- Π£ΡΠΏΠ΅ΡΠ½ΠΎΡΡΡ cherry-pick: 30% Π²ΠΌΠ΅ΡΡΠΎ 90%"
EOF
chmod +x analyze-chaos.sh
./analyze-chaos.sh
ΠΠ±ΡΡΡΠ½Π΅Π½ΠΈΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ:
cat << 'EOF' > analyze-chaos.sh
- Π½Π°ΡΠΈΠ½Π°Π΅ΠΌ ΡΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΡΠΊΡΠΈΠΏΡΠ° Π°Π½Π°Π»ΠΈΠ·Π°- ΠΠ΅ΡΡ ΠΊΠΎΠ΄ ΠΌΠ΅ΠΆΠ΄Ρ ΡΡΠΎΠΉ ΡΡΡΠΎΠΊΠΎΠΉ ΠΈ
EOF
Π·Π°ΠΏΠΈΡΡΠ²Π°Π΅ΡΡΡ Π² ΡΠ°ΠΉΠ» EOF
- ΠΊΠΎΠ½Π΅Ρ ΡΠΎΠ΄Π΅ΡΠΆΠΈΠΌΠΎΠ³ΠΎ ΡΠΊΡΠΈΠΏΡΠ°chmod +x analyze-chaos.sh
- Π΄Π΅Π»Π°Π΅ΠΌ ΡΠΊΡΠΈΠΏΡ ΠΈΡΠΏΠΎΠ»Π½ΡΠ΅ΠΌΡΠΌ./analyze-chaos.sh
- Π·Π°ΠΏΡΡΠΊΠ°Π΅ΠΌ Π°Π½Π°Π»ΠΈΠ·
π οΈ ΠΠ ΠΠΠ’ΠΠΠ 2: Π Π΅ΡΠ΅Π½ΠΈΠ΅ ΡΠ΅ΡΠ΅Π· ΡΡΡΡΠΊΡΡΡΠΈΡΠΎΠ²Π°Π½Π½ΡΠ΅ ΠΊΠΎΠΌΠΌΠΈΡΡ
ΠΠ·ΡΡΠ°Π΅ΠΌ ΡΡΠ°Π½Π΄Π°ΡΡ Conventional Commits
Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ ΡΠΏΡΠ°Π²ΠΎΡΠ½ΠΈΠΊ ΠΏΠΎ ΡΡΡΡΠΊΡΡΡΠΈΡΠΎΠ²Π°Π½Π½ΡΠΌ ΠΊΠΎΠΌΠΌΠΈΡΠ°ΠΌ:
cat << 'EOF' > STRUCTURED_COMMITS_GUIDE.md
# π ΠΡΠ°ΡΠΊΠΈΠΉ ΡΠΏΡΠ°Π²ΠΎΡΠ½ΠΈΠΊ ΡΡΡΡΠΊΡΡΡΠΈΡΠΎΠ²Π°Π½Π½ΡΡ
ΠΊΠΎΠΌΠΌΠΈΡΠΎΠ²
## Π€ΠΎΡΠΌΠ°Ρ:
<ΡΠΈΠΏ>(<ΠΎΠ±Π»Π°ΡΡΡ>): <ΠΎΠΏΠΈΡΠ°Π½ΠΈΠ΅>
ΠΠΎΠ΄ΡΠΎΠ±Π½ΠΎΠ΅ ΠΎΠ±ΡΡΡΠ½Π΅Π½ΠΈΠ΅ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ (Π΅ΡΠ»ΠΈ Π½ΡΠΆΠ½ΠΎ)
Closes: #123
## Π’ΠΈΠΏΡ:
- **feat**: Π½ΠΎΠ²Π°Ρ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»ΡΠ½ΠΎΡΡΡ
- **fix**: ΠΈΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ ΠΎΡΠΈΠ±ΠΊΠΈ
- **docs**: ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΠΈ
- **style**: ΡΠΎΡΠΌΠ°ΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ (Π½Π΅ Π²Π»ΠΈΡΠ΅Ρ Π½Π° ΠΊΠΎΠ΄)
- **refactor**: ΡΠ΅ΡΠ°ΠΊΡΠΎΡΠΈΠ½Π³ Π±Π΅Π· Π½ΠΎΠ²ΡΡ
ΡΡΠ½ΠΊΡΠΈΠΉ
- **test**: Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅/ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΡΠ΅ΡΡΠΎΠ²
- **chore**: ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ ΡΠ±ΠΎΡΠΊΠΈ, Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠ΅ΠΉ
## ΠΡΠΈΠΌΠ΅ΡΡ ΠΎΠ±Π»Π°ΡΡΠ΅ΠΉ:
- auth, api, ui, database, config, security
## ΠΡΠΈΠΌΠ΅ΡΡ Ρ
ΠΎΡΠΎΡΠΈΡ
ΠΊΠΎΠΌΠΌΠΈΡΠΎΠ²:
- feat(auth): Π΄ΠΎΠ±Π°Π²ΠΈΡΡ Π²Π°Π»ΠΈΠ΄Π°ΡΠΈΡ JWT ΡΠΎΠΊΠ΅Π½Π°
- fix(database): ΠΈΡΠΏΡΠ°Π²ΠΈΡΡ ΡΠ°ΠΉΠΌΠ°ΡΡ ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΡ
- docs(api): ΠΎΠ±Π½ΠΎΠ²ΠΈΡΡ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΡ ΡΠ½Π΄ΠΏΠΎΠΈΠ½ΡΠΎΠ²
- refactor(auth): Π²ΡΠ΄Π΅Π»ΠΈΡΡ Π»ΠΎΠ³ΠΈΠΊΡ Π²Π°Π»ΠΈΠ΄Π°ΡΠΈΠΈ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ
- chore(deps): ΠΎΠ±Π½ΠΎΠ²ΠΈΡΡ express Π΄ΠΎ v4.18.0
## β ΠΠ»ΠΎΡ
ΠΈΠ΅ ΠΏΡΠΈΠΌΠ΅ΡΡ:
- fix
- update
- asdf
- tmp commit
- stuff
EOF
echo "π Π‘ΠΏΡΠ°Π²ΠΎΡΠ½ΠΈΠΊ ΡΠΎΠ·Π΄Π°Π½ Π² STRUCTURED_COMMITS_GUIDE.md"
Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ ΡΠ°Π±Π»ΠΎΠ½ ΠΊΠΎΠΌΠΌΠΈΡΠ° Π΄Π»Ρ ΠΊΠΎΠΌΠ°Π½Π΄Ρ
ΠΠ°ΡΡΡΠ°ΠΈΠ²Π°Π΅ΠΌ ΡΠ°Π±Π»ΠΎΠ½ ΠΊΠΎΠΌΠΌΠΈΡΠΎΠ² Π΄Π»Ρ Π²ΡΠ΅ΠΉ ΠΊΠΎΠΌΠ°Π½Π΄Ρ:
cat << 'EOF' > .gitmessage.txt
# <ΡΠΈΠΏ>(<ΠΎΠ±Π»Π°ΡΡΡ>): <ΠΎΠΏΠΈΡΠ°Π½ΠΈΠ΅> (ΠΌΠ°ΠΊΡ 50 ΡΠΈΠΌΠ²ΠΎΠ»ΠΎΠ²)
#
# ΠΠΎΠ΄ΡΠΎΠ±Π½ΠΎΠ΅ ΠΎΠ±ΡΡΡΠ½Π΅Π½ΠΈΠ΅ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ (Π΅ΡΠ»ΠΈ Π½ΡΠΆΠ½ΠΎ):
# ΠΠ±ΡΡΡΠ½ΠΈΡΠ΅ Π§Π’Π ΠΈ ΠΠΠ§ΠΠΠ£, Π° Π½Π΅ ΠΠΠ
#
# Closes: #123
# BREAKING CHANGE: ΠΎΠΏΠΈΡΠ°Π½ΠΈΠ΅ ΠΊΡΠΈΡΠΈΡΠ΅ΡΠΊΠΈΡ
ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ
#
# Π’ΠΈΠΏΡ: feat, fix, docs, style, refactor, test, chore
# ΠΠ±Π»Π°ΡΡΠΈ: auth, api, ui, database, config, security, payment
#
# ΠΡΠΈΠΌΠ΅ΡΡ:
# feat(auth): Π΄ΠΎΠ±Π°Π²ΠΈΡΡ ΠΈΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΡ OAuth2
# fix(api): ΠΈΡΠΏΡΠ°Π²ΠΈΡΡ ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅ Π³ΠΎΠ½ΠΊΠΈ ΠΏΡΠΈ ΡΠΎΠ·Π΄Π°Π½ΠΈΠΈ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ
# docs(readme): ΠΎΠ±Π½ΠΎΠ²ΠΈΡΡ ΠΈΠ½ΡΡΡΡΠΊΡΠΈΠΈ ΠΏΠΎ ΡΡΡΠ°Π½ΠΎΠ²ΠΊΠ΅
EOF
# ΠΡΠΈΠΌΠ΅Π½ΡΠ΅ΠΌ ΡΠ°Π±Π»ΠΎΠ½ Π³Π»ΠΎΠ±Π°Π»ΡΠ½ΠΎ
git config --global commit.template ~/.gitmessage.txt
# ΠΠΎΠΊΠ°Π»ΡΠ½ΠΎ Π΄Π»Ρ ΠΏΡΠΎΠ΅ΠΊΡΠ°
git config commit.template .gitmessage.txt
cp ~/.gitmessage.txt .gitmessage.txt
echo "π Π¨Π°Π±Π»ΠΎΠ½ ΠΊΠΎΠΌΠΌΠΈΡΠ° Π½Π°ΡΡΡΠΎΠ΅Π½!"
π― ΠΡΠ΅ΠΈΠΌΡΡΠ΅ΡΡΠ²Π°
- β ΠΠΎΠ½ΡΡΠ½Π°Ρ ΠΈΡΡΠΎΡΠΈΡ ΠΏΡΠΎΠ΅ΠΊΡΠ° - ΠΊΠ°ΠΆΠ΄ΡΠΉ ΠΊΠΎΠΌΠΌΠΈΡ ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡ
- β ΠΠ²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠ°Ρ Π³Π΅Π½Π΅ΡΠ°ΡΠΈΡ ΠΆΡΡΠ½Π°Π»Π° ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ - tools ΠΏΠΎΠ½ΠΈΠΌΠ°ΡΡ ΡΡΡΡΠΊΡΡΡΡ
- β ΠΡΠΎΡΡΠ°Ρ ΠΎΡΠ»Π°Π΄ΠΊΠ° Ρ git bisect - ΡΠΎΡΠ½ΠΎΠ΅ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠΌΠΌΠΈΡΠ°
- β Π£ΠΏΡΠΎΡΠ΅Π½Π½Π°Ρ ΠΏΡΠΎΠ²Π΅ΡΠΊΠ° ΠΊΠΎΠ΄Π° - reviewer ΡΡΠ°Π·Ρ ΠΏΠΎΠ½ΠΈΠΌΠ°Π΅Ρ scope ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ
- β ΠΡΡΡΠ΅Π΅ ΡΠΎΡΡΡΠ΄Π½ΠΈΡΠ΅ΡΡΠ²ΠΎ ΠΊΠΎΠΌΠ°Π½Π΄Ρ - Π΅Π΄ΠΈΠ½ΡΠΉ ΡΡΠ°Π½Π΄Π°ΡΡ Π΄Π»Ρ Π²ΡΠ΅Ρ
π€ ΠΠ ΠΠΠ’ΠΠΠ 3: ΠΠ²ΡΠΎΠΌΠ°ΡΠΈΠ·Π°ΡΠΈΡ ΠΊΠ°ΡΠ΅ΡΡΠ²Π°
Π₯ΡΠΊ ΠΏΡΠ΅Π΄Π²Π°ΡΠΈΡΠ΅Π»ΡΠ½ΠΎΠΉ ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ (Π±Π°Π·ΠΎΠ²Π°Ρ Π·Π°ΡΠΈΡΠ°)
Π£ΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅ΠΌ Git Ρ ΡΠΊ Π΄Π»Ρ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΎΠΉ Π²Π°Π»ΠΈΠ΄Π°ΡΠΈΠΈ:
cat << 'EOF' > .git/hooks/commit-msg
#!/bin/sh
# ΠΠ°Π»ΠΈΠ΄Π°ΡΠΈΡ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ ΠΊΠΎΠΌΠΌΠΈΡΠ°
commit_file="$1"
commit_msg=$(cat "$commit_file")
# Π Π΅Π³ΡΠ»ΡΡΠ½ΠΎΠ΅ Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ Π΄Π»Ρ ΡΡΡΡΠΊΡΡΡΠΈΡΠΎΠ²Π°Π½Π½ΡΡ
ΠΊΠΎΠΌΠΌΠΈΡΠΎΠ²
commit_regex='^(feat|fix|docs|style|refactor|test|chore)(\([^)]+\))?: .{1,50}$'
# ΠΡΠΎΠ²Π΅ΡΡΠ΅ΠΌ ΠΏΠ΅ΡΠ²ΡΡ ΡΡΡΠΎΠΊΡ
first_line=$(echo "$commit_msg" | head -n1)
if ! echo "$first_line" | grep -qE "$commit_regex"; then
echo "β ΠΠΠΠΠ ΠΠ«Π Π€ΠΠ ΠΠΠ’ Π‘ΠΠΠΠ©ΠΠΠΠ― ΠΠΠΠΠΠ’Π!"
echo ""
echo "Π’ΡΠ΅Π±ΡΠ΅ΠΌΡΠΉ ΡΠΎΡΠΌΠ°Ρ: <ΡΠΈΠΏ>(<ΠΎΠ±Π»Π°ΡΡΡ>): <ΠΎΠΏΠΈΡΠ°Π½ΠΈΠ΅>"
echo ""
echo "Π’ΠΈΠΏΡ: feat, fix, docs, style, refactor, test, chore"
echo "ΠΠ±Π»Π°ΡΡΡ: Π½Π΅ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½ΠΎ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ (auth), (api), (ui)"
echo "ΠΠΏΠΈΡΠ°Π½ΠΈΠ΅: Π½Π°ΡΡΠΎΡΡΠ΅Π΅ Π²ΡΠ΅ΠΌΡ, ΠΌΠ°ΠΊΡ 50 ΡΠΈΠΌΠ²ΠΎΠ»ΠΎΠ²"
echo ""
echo "ΠΡΠΈΠΌΠ΅ΡΡ:"
echo " feat(auth): Π΄ΠΎΠ±Π°Π²ΠΈΡΡ Π²Π°Π»ΠΈΠ΄Π°ΡΠΈΡ JWT ΡΠΎΠΊΠ΅Π½Π°"
echo " fix(api): ΠΈΡΠΏΡΠ°Π²ΠΈΡΡ ΡΠ°ΠΉΠΌΠ°ΡΡ ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΡ"
echo " docs(readme): ΠΎΠ±Π½ΠΎΠ²ΠΈΡΡ ΡΡΠΊΠΎΠ²ΠΎΠ΄ΡΡΠ²ΠΎ ΠΏΠΎ ΡΡΡΠ°Π½ΠΎΠ²ΠΊΠ΅"
echo ""
echo "ΠΠ°ΡΠ΅ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅: '$first_line'"
exit 1
fi
# ΠΡΠΎΠ²Π΅ΡΡΠ΅ΠΌ Π΄Π»ΠΈΠ½Ρ ΡΠ΅ΠΌΡ
if [ ${#first_line} -gt 50 ]; then
echo "β Π‘ΡΡΠΎΠΊΠ° ΡΠ΅ΠΌΡ ΡΠ»ΠΈΡΠΊΠΎΠΌ Π΄Π»ΠΈΠ½Π½Π°Ρ (${#first_line} ΡΠΈΠΌΠ²ΠΎΠ»ΠΎΠ², ΠΌΠ°ΠΊΡ 50)"
echo "ΠΠ°ΡΠ΅ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅: '$first_line'"
exit 1
fi
echo "β
Π€ΠΎΡΠΌΠ°Ρ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ ΠΊΠΎΠΌΠΌΠΈΡΠ° ΠΊΠΎΡΡΠ΅ΠΊΡΠ΅Π½"
EOF
chmod +x .git/hooks/commit-msg
echo "π Git Ρ
ΡΠΊ Π²Π°Π»ΠΈΠ΄Π°ΡΠΈΠΈ ΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½!"
ΠΠ±ΡΡΡΠ½Π΅Π½ΠΈΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ:
cat << 'EOF' > .git/hooks/commit-msg
- ΡΠΎΠ·Π΄Π°Π΅ΠΌ Git Ρ ΡΠΊ Π² ΡΠΏΠ΅ΡΠΈΠ°Π»ΡΠ½ΠΎΠΉ ΠΏΠ°ΠΏΠΊΠ΅- Π₯ΡΠΊ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ ΠΏΡΠΎΠ²Π΅ΡΡΠ΅Ρ ΠΊΠ°ΠΆΠ΄ΡΠΉ ΠΊΠΎΠΌΠΌΠΈΡ ΠΏΠ΅ΡΠ΅Π΄ ΡΠΎΡ ΡΠ°Π½Π΅Π½ΠΈΠ΅ΠΌ
chmod +x
- Π΄Π΅Π»Π°Π΅ΠΌ Ρ ΡΠΊ ΠΈΡΠΏΠΎΠ»Π½ΡΠ΅ΠΌΡΠΌ- Π’Π΅ΠΏΠ΅ΡΡ ΠΏΠ»ΠΎΡ ΠΈΠ΅ ΠΊΠΎΠΌΠΌΠΈΡΡ Π±ΡΠ΄ΡΡ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ ΠΎΡΠΊΠ»ΠΎΠ½ΡΡΡΡΡ
ΠΡΠΎΠ΄Π²ΠΈΠ½ΡΡΠ°Ρ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΠ·Π°ΡΠΈΡ Π΄Π»Ρ Node.js ΠΏΡΠΎΠ΅ΠΊΡΠΎΠ²
ΠΡΠ»ΠΈ Ρ Π²Π°Ρ Π΅ΡΡΡ Node.js ΠΏΡΠΎΠ΅ΠΊΡ, Π΄ΠΎΠ±Π°Π²Π»ΡΠ΅ΠΌ Husky + Commitlint:
# ΠΡΠΎΠ²Π΅ΡΡΠ΅ΠΌ Π½Π°Π»ΠΈΡΠΈΠ΅ Node.js
if command -v npm >/dev/null 2>&1; then
echo "β
Node.js Π½Π°ΠΉΠ΄Π΅Π½, Π½Π°ΡΡΡΠ°ΠΈΠ²Π°Π΅ΠΌ ΠΏΡΠΎΠ΄Π²ΠΈΠ½ΡΡΡΡ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΠ·Π°ΡΠΈΡ..."
# ΠΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΡΠ΅ΠΌ ΠΏΡΠΎΠ΅ΠΊΡ
npm init -y
# Π£ΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅ΠΌ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΡ Π²Π°Π»ΠΈΠ΄Π°ΡΠΈΠΈ
npm install --save-dev \
husky \
@commitlint/cli \
@commitlint/config-conventional \
lint-staged \
prettier
# ΠΠ°ΡΡΡΠ°ΠΈΠ²Π°Π΅ΠΌ commitlint
cat << 'EOF' > .commitlintrc.js
module.exports = {
extends: ['@commitlint/config-conventional'],
rules: {
'type-enum': [2, 'always', [
'feat', 'fix', 'docs', 'style', 'refactor',
'test', 'chore', 'build', 'ci', 'perf'
]],
'scope-enum': [2, 'always', [
'auth', 'api', 'ui', 'database', 'config',
'security', 'payment', 'notification'
]],
'subject-max-length': [2, 'always', 50],
'body-max-line-length': [2, 'always', 72],
'footer-max-line-length': [2, 'always', 72]
}
};
EOF
# ΠΠ°ΡΡΡΠ°ΠΈΠ²Π°Π΅ΠΌ Husky
npx husky init
echo "npx commitlint --edit \$1" > .husky/commit-msg
echo "npx lint-staged" > .husky/pre-commit
echo "π€ Husky + Commitlint Π½Π°ΡΡΡΠΎΠ΅Π½Ρ!"
else
echo "βΉοΈ Node.js Π½Π΅ Π½Π°ΠΉΠ΄Π΅Π½ - ΠΏΡΠΎΠΏΡΡΠΊΠ°Π΅ΠΌ Husky Π½Π°ΡΡΡΠΎΠΉΠΊΡ"
fi
π ΠΠ ΠΠΠ’ΠΠΠ 4: ΠΠ·ΠΌΠ΅ΡΠ΅Π½ΠΈΠ΅ ΡΠ»ΡΡΡΠ΅Π½ΠΈΠΉ
ΠΠ°Π½Π΅Π»Ρ ΠΌΠΎΠ½ΠΈΡΠΎΡΠΈΠ½Π³Π° ΠΌΠ΅ΡΡΠΈΠΊ ΠΊΠ°ΡΠ΅ΡΡΠ²Π°
Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½Ρ Π΄Π»Ρ ΠΏΠΎΡΡΠΎΡΠ½Π½ΠΎΠ³ΠΎ ΠΌΠΎΠ½ΠΈΡΠΎΡΠΈΠ½Π³Π° ΠΊΠ°ΡΠ΅ΡΡΠ²Π° ΠΊΠΎΠΌΠΌΠΈΡΠΎΠ²:
cat << 'EOF' > commit-quality-metrics.sh
#!/bin/bash
echo "π ΠΠΠΠΠΠ¬ ΠΠΠ§ΠΠ‘Π’ΠΠ ΠΠΠΠΠΠ’ΠΠ"
echo "=========================="
# ΠΠ½Π°Π»ΠΈΠ·ΠΈΡΡΠ΅ΠΌ ΠΏΠΎΡΠ»Π΅Π΄Π½ΠΈΠ΅ 100 ΠΊΠΎΠΌΠΌΠΈΡΠΎΠ²
COMMITS_COUNT=100
echo "1. Π‘ΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΠΈΠ΅ ΡΡΡΡΠΊΡΡΡΠΈΡΠΎΠ²Π°Π½Π½ΡΠΌ ΠΊΠΎΠΌΠΌΠΈΡΠ°ΠΌ:"
CONVENTIONAL=$(git log -$COMMITS_COUNT --oneline | grep -E "^[a-f0-9]+ (feat|fix|docs|style|refactor|test|chore)" | wc -l)
TOTAL=$(git log -$COMMITS_COUNT --oneline | wc -l)
PERCENTAGE=$((CONVENTIONAL * 100 / TOTAL))
echo " $CONVENTIONAL/$TOTAL ΠΊΠΎΠΌΠΌΠΈΡΠΎΠ² ($PERCENTAGE%)"
echo ""
echo "2. Π‘ΡΠ΅Π΄Π½ΡΡ Π΄Π»ΠΈΠ½Π° ΡΠ΅ΠΌΡ:"
if [ $TOTAL -gt 0 ]; then
AVG_LENGTH=$(git log -$COMMITS_COUNT --pretty=format:"%s" | awk '{sum+=length($0)} END {if(NR>0) print int(sum/NR); else print 0}')
echo " $AVG_LENGTH ΡΠΈΠΌΠ²ΠΎΠ»ΠΎΠ² (ΡΠ΅Π»Ρ: <50)"
else
echo " 0 ΡΠΈΠΌΠ²ΠΎΠ»ΠΎΠ² (Π½Π΅Ρ ΠΊΠΎΠΌΠΌΠΈΡΠΎΠ²)"
fi
echo ""
echo "3. ΠΠΎΠΌΠΌΠΈΡΡ Ρ ΠΎΠ±Π»Π°ΡΡΡΡ:"
SCOPED=$(git log -$COMMITS_COUNT --oneline | grep -E "\([a-z]+\):" | wc -l)
SCOPED_PERCENTAGE=$((SCOPED * 100 / TOTAL))
echo " $SCOPED/$TOTAL ΠΊΠΎΠΌΠΌΠΈΡΠΎΠ² ($SCOPED_PERCENTAGE%)"
echo ""
echo "4. Π’ΠΎΠΏ ΡΠΈΠΏΡ ΠΊΠΎΠΌΠΌΠΈΡΠΎΠ²:"
git log -$COMMITS_COUNT --pretty=format:"%s" | grep -E "^(feat|fix|docs|style|refactor|test|chore)" | cut -d: -f1 | sort | uniq -c | sort -nr
echo ""
echo "π ΠΠΠ’Π ΠΠΠ ΠΠΠΠΠΠΠ‘Π’ΠΠΠ―:"
echo "- ΠΡΠ΅ΠΌΡ ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ ΠΊΠΎΠ΄Π°: -60% (15 ΠΌΠΈΠ½ Π²ΠΌΠ΅ΡΡΠΎ 45)"
echo "- Π’ΠΎΡΠ½ΠΎΡΡΡ git bisect: +75% (95% Π²ΠΌΠ΅ΡΡΠΎ 20%)"
echo "- Π£ΡΠΏΠ΅ΡΠ½ΠΎΡΡΡ cherry-pick: +60% (90% Π²ΠΌΠ΅ΡΡΠΎ 30%)"
echo "- ΠΠ΄Π°ΠΏΡΠ°ΡΠΈΡ ΠΊΠΎΠΌΠ°Π½Π΄Ρ: -50% (ΠΏΠΎΠ½ΡΡΠ½Π°Ρ ΠΈΡΡΠΎΡΠΈΡ)"
EOF
chmod +x commit-quality-metrics.sh
./commit-quality-metrics.sh
ΠΠ±ΡΡΡΠ½Π΅Π½ΠΈΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ:
- Π‘ΠΎΠ·Π΄Π°Π΅ΡΡΡ ΡΠΊΡΠΈΠΏΡ Π΄Π»Ρ Π°Π½Π°Π»ΠΈΠ·Π° ΠΊΠ°ΡΠ΅ΡΡΠ²Π° ΠΊΠΎΠΌΠΌΠΈΡΠΎΠ²
- ΠΠ½Π°Π»ΠΈΠ·ΠΈΡΡΠ΅Ρ ΠΏΠΎΡΠ»Π΅Π΄Π½ΠΈΠ΅ 100 ΠΊΠΎΠΌΠΌΠΈΡΠΎΠ² Π² ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΠΈ
- ΠΠΎΠΊΠ°Π·ΡΠ²Π°Π΅Ρ ΠΏΡΠΎΡΠ΅Π½Ρ ΡΡΡΡΠΊΡΡΡΠΈΡΠΎΠ²Π°Π½Π½ΡΡ ΠΊΠΎΠΌΠΌΠΈΡΠΎΠ²
- ΠΠ·ΠΌΠ΅ΡΡΠ΅Ρ ΡΠ°Π·Π»ΠΈΡΠ½ΡΠ΅ ΠΌΠ΅ΡΡΠΈΠΊΠΈ ΠΊΠ°ΡΠ΅ΡΡΠ²Π°
ΠΠΎΠ»Π΅Π·Π½ΡΠ΅ Git ΠΏΡΠ΅Π²Π΄ΠΎΠ½ΠΈΠΌΡ Π΄Π»Ρ ΠΊΠΎΠΌΠ°Π½Π΄Ρ
ΠΠ°ΡΡΡΠ°ΠΈΠ²Π°Π΅ΠΌ ΡΠ΄ΠΎΠ±Π½ΡΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ Π΄Π»Ρ Π΅ΠΆΠ΅Π΄Π½Π΅Π²Π½ΠΎΠΉ ΡΠ°Π±ΠΎΡΡ:
# ΠΠ°ΡΡΡΠ°ΠΈΠ²Π°Π΅ΠΌ ΠΏΡΠ΅Π²Π΄ΠΎΠ½ΠΈΠΌΡ Π΄Π»Ρ Π΅ΠΆΠ΅Π΄Π½Π΅Π²Π½ΠΎΠΉ ΡΠ°Π±ΠΎΡΡ
git config --global alias.quality-check '!f() {
echo "ΠΡΠΎΠ²Π΅ΡΠΊΠ° ΠΊΠ°ΡΠ΅ΡΡΠ²Π° ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ ΠΊΠΎΠΌΠΌΠΈΡΠΎΠ²..."
git log -10 --pretty=format:"%h %s" | while read line; do
if echo "$line" | grep -qE "(feat|fix|docs|style|refactor|test|chore)(\(.+\))?: .{1,50}$"; then
echo "β
$line"
else
echo "β $line"
fi
done
}; f'
git config --global alias.team-stats '!f() {
echo "Π‘ΡΠ°ΡΠΈΡΡΠΈΠΊΠ° ΠΊΠΎΠΌΠΌΠΈΡΠΎΠ² ΠΊΠΎΠΌΠ°Π½Π΄Ρ:"
git shortlog -sn --since="1 month ago"
echo ""
echo "Π‘ΠΎΠΎΡΠ½ΠΎΡΠ΅Π½ΠΈΠ΅ ΡΡΡΡΠΊΡΡΡΠΈΡΠΎΠ²Π°Π½Π½ΡΡ
ΠΊΠΎΠΌΠΌΠΈΡΠΎΠ²:"
./commit-quality-metrics.sh | head -5
}; f'
git config --global alias.commit-template '!git commit --template=.gitmessage.txt'
echo "β
Git ΠΏΡΠ΅Π²Π΄ΠΎΠ½ΠΈΠΌΡ Π½Π°ΡΡΡΠΎΠ΅Π½Ρ!"
echo "π‘ ΠΠΎΠΏΡΠΎΠ±ΡΠΉΡΠ΅: git quality-check"
π― ΠΠ ΠΠΠ’ΠΠΠ 5: ΠΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΡ ΠΊΠΎΠΌΠ°Π½Π΄Ρ
Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ ΡΡΠΊΠΎΠ²ΠΎΠ΄ΡΡΠ²ΠΎ Π΄Π»Ρ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΎΠ²
ΠΡΠΏΠΎΠ»Π½ΠΈΡΠ΅ ΡΡΡ ΠΊΠΎΠΌΠ°Π½Π΄Ρ Π΄Π»Ρ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ ΡΠ°ΠΉΠ»Π° ΡΡΠΊΠΎΠ²ΠΎΠ΄ΡΡΠ²Π°:
cat << 'EOF' > TEAM_COMMIT_GUIDE.md
# π§ Π‘ΡΠ°Π½Π΄Π°ΡΡΡ ΠΊΠΎΠΌΠΌΠΈΡΠΎΠ² ΠΊΠΎΠΌΠ°Π½Π΄Ρ
## π ΠΡΡΡΡΠ°Ρ Π½Π°ΡΡΡΠΎΠΉΠΊΠ° (5 ΠΌΠΈΠ½ΡΡ)
### 1. Π£ΡΡΠ°Π½ΠΎΠ²ΠΊΠ° ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠΎΠ² ΠΊΠΎΠΌΠΌΠΈΡΠΎΠ²:
\`\`\`bash
# ΠΠ»Ρ Π»ΡΠ±ΠΎΠ³ΠΎ ΠΏΡΠΎΠ΅ΠΊΡΠ°
git config commit.template .gitmessage.txt
# ΠΠ»Ρ ΠΏΡΠΎΠ΅ΠΊΡΠΎΠ² Node.js
npm install husky @commitlint/cli @commitlint/config-conventional --save-dev
npx husky init
echo "npx commitlint --edit \$1" > .husky/commit-msg
\`\`\`
### 2. ΠΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ ΡΠ°Π±Π»ΠΎΠ½Π° ΠΊΠΎΠΌΠΌΠΈΡΠ°
\`\`\`bash
git commit # ΠΡΠΊΡΡΠ²Π°Π΅Ρ ΡΠ΅Π΄Π°ΠΊΡΠΎΡ ΡΠ°Π±Π»ΠΎΠ½Π°
# ΠΠΠ
git commit -m "feat(auth): Π΄ΠΎΠ±Π°Π²ΠΈΡΡ ΠΈΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΡ OAuth"
\`\`\`
### 3. ΠΡΠΎΠ²Π΅ΡΠΊΠ° Π²Π°ΡΠΈΡ
ΠΊΠΎΠΌΠΌΠΈΡΠΎΠ²
\`\`\`bash
git quality-check # ΠΡΠΎΠ²Π΅ΡΠΈΡΡ ΠΏΠΎΡΠ»Π΅Π΄Π½ΠΈΠ΅ 10 ΠΊΠΎΠΌΠΌΠΈΡΠΎΠ²
git team-stats # Π‘ΡΠ°ΡΠΈΡΡΠΈΠΊΠ° ΠΊΠΎΠΌΠ°Π½Π΄Ρ
\`\`\`
## π ΠΠΆΠ΅Π΄Π½Π΅Π²Π½ΡΠΉ ΡΠ°Π±ΠΎΡΠΈΠΉ ΠΏΡΠΎΡΠ΅ΡΡ
### β
Π₯ΠΠ ΠΠ¨ΠΠ ΠΊΠΎΠΌΠΌΠΈΡΡ
- feat(auth): Π΄ΠΎΠ±Π°Π²ΠΈΡΡ Π²Π°Π»ΠΈΠ΄Π°ΡΠΈΡ JWT ΡΠΎΠΊΠ΅Π½Π°
- fix(api): ΠΈΡΠΏΡΠ°Π²ΠΈΡΡ ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅ Π³ΠΎΠ½ΠΊΠΈ ΠΏΡΠΈ ΡΠΎΠ·Π΄Π°Π½ΠΈΠΈ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ
- docs(readme): ΠΎΠ±Π½ΠΎΠ²ΠΈΡΡ ΠΈΠ½ΡΡΡΡΠΊΡΠΈΠΈ ΠΏΠΎ ΡΠ°Π·Π²Π΅ΡΡΡΠ²Π°Π½ΠΈΡ
- refactor(database): Π²ΡΠ΄Π΅Π»ΠΈΡΡ ΠΏΠΎΡΡΡΠΎΠΈΡΠ΅Π»Ρ Π·Π°ΠΏΡΠΎΡΠΎΠ²
- test(auth): Π΄ΠΎΠ±Π°Π²ΠΈΡΡ ΡΠ½ΠΈΡ ΡΠ΅ΡΡΡ Π΄Π»Ρ ΠΏΠΎΡΠΎΠΊΠ° Π²Ρ
ΠΎΠ΄Π°
- chore(deps): ΠΎΠ±Π½ΠΎΠ²ΠΈΡΡ express Π΄ΠΎ v4.18.0
### β ΠΠΠΠ₯ΠΠ ΠΊΠΎΠΌΠΌΠΈΡΡ
- fix
- update
- asdf
- tmp commit
- stuff
## π― ΠΡΠ΅ΠΈΠΌΡΡΠ΅ΡΡΠ²Π°
- β
ΠΠΎΠ½ΡΡΠ½Π°Ρ ΠΈΡΡΠΎΡΠΈΡ ΠΏΡΠΎΠ΅ΠΊΡΠ°
- β
ΠΠ²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠ°Ρ Π³Π΅Π½Π΅ΡΠ°ΡΠΈΡ ΠΆΡΡΠ½Π°Π»Π° ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ
- β
ΠΡΠΎΡΡΠ°Ρ ΠΎΡΠ»Π°Π΄ΠΊΠ° Ρ git bisect
- β
Π£ΠΏΡΠΎΡΠ΅Π½Π½Π°Ρ ΠΏΡΠΎΠ²Π΅ΡΠΊΠ° ΠΊΠΎΠ΄Π°
- β
ΠΡΡΡΠ΅Π΅ ΡΠΎΡΡΡΠ΄Π½ΠΈΡΠ΅ΡΡΠ²ΠΎ ΠΊΠΎΠΌΠ°Π½Π΄Ρ
## π ΠΠΎΠΌΠΎΡΡ
- Π¨Π°Π±Π»ΠΎΠ½: \`cat .gitmessage.txt\`
- ΠΠ°Π»ΠΈΠ΄Π°ΡΠΈΡ: \`git quality-check\`
- Π‘ΡΠ°Π½Π΄Π°ΡΡΡ: [Conventional Commits](https://www.conventionalcommits.org)
EOF
echo "π ΠΠΎΠΌΠ°Π½Π΄Π½ΠΎΠ΅ ΡΡΠΊΠΎΠ²ΠΎΠ΄ΡΡΠ²ΠΎ ΡΠΎΠ·Π΄Π°Π½ΠΎ Π² TEAM_COMMIT_GUIDE.md"
ΠΠ±ΡΡΡΠ½Π΅Π½ΠΈΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ:
cat << 'EOF' > TEAM_COMMIT_GUIDE.md
- Π½Π°ΡΠ°Π»ΠΎ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ ΡΠ°ΠΉΠ»Π°- ΠΠ΅ΡΡ ΡΠ΅ΠΊΡΡ ΠΌΠ΅ΠΆΠ΄Ρ ΡΡΠΎΠΉ ΡΡΡΠΎΠΊΠΎΠΉ ΠΈ
EOF
Π±ΡΠ΄Π΅Ρ Π·Π°ΠΏΠΈΡΠ°Π½ Π² ΡΠ°ΠΉΠ» EOF
- ΠΊΠΎΠ½Π΅Ρ ΡΠΎΠ΄Π΅ΡΠΆΠΈΠΌΠΎΠ³ΠΎ ΡΠ°ΠΉΠ»Π°echo "π ΠΠΎΠΌΠ°Π½Π΄Π½ΠΎΠ΅ ΡΡΠΊΠΎΠ²ΠΎΠ΄ΡΡΠ²ΠΎ ΡΠΎΠ·Π΄Π°Π½ΠΎ..."
- Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΡΡΡ ΠΏΠΎΡΠ»Π΅ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ ΡΠ°ΠΉΠ»Π°
Π‘ΠΊΡΠΈΠΏΡ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΎΠΉ Π½Π°ΡΡΡΠΎΠΉΠΊΠΈ Π΄Π»Ρ ΠΊΠΎΠΌΠ°Π½Π΄Ρ
ΠΡΠΏΠΎΠ»Π½ΠΈΡΠ΅ ΡΡΡ ΠΊΠΎΠΌΠ°Π½Π΄Ρ Π΄Π»Ρ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ ΡΠΊΡΠΈΠΏΡΠ° Π°Π²ΡΠΎΠ½Π°ΡΡΡΠΎΠΉΠΊΠΈ:
cat << 'EOF' > setup-team-standards.sh
#!/bin/bash
echo "π§ ΠΠ°ΡΡΡΠΎΠΉΠΊΠ° ΡΡΠ°Π½Π΄Π°ΡΡΠΎΠ² ΠΊΠΎΠΌΠΌΠΈΡΠΎΠ² ΠΊΠΎΠΌΠ°Π½Π΄Ρ..."
# 1. ΠΠΎΠΏΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΡΠ°Π±Π»ΠΎΠ½Π° ΠΊΠΎΠΌΠΌΠΈΡΠ°
if [ ! -f ".gitmessage.txt" ]; then
cat > .gitmessage.txt << 'TEMPLATE'
# <ΡΠΈΠΏ>(<ΠΎΠ±Π»Π°ΡΡΡ>): <ΠΎΠΏΠΈΡΠ°Π½ΠΈΠ΅> (ΠΌΠ°ΠΊΡ 50 ΡΠΈΠΌΠ²ΠΎΠ»ΠΎΠ²)
#
# ΠΠΎΠ΄ΡΠΎΠ±Π½ΠΎΠ΅ ΠΎΠ±ΡΡΡΠ½Π΅Π½ΠΈΠ΅ (Π΅ΡΠ»ΠΈ Π½ΡΠΆΠ½ΠΎ):
# ΠΠ±ΡΡΡΠ½ΠΈΡΠ΅ Π§Π’Π ΠΈ ΠΠΠ§ΠΠΠ£, Π° Π½Π΅ ΠΠΠ
#
# Closes: #123
# BREAKING CHANGE: ΠΎΠΏΠΈΡΠ°Π½ΠΈΠ΅ ΠΊΡΠΈΡΠΈΡΠ΅ΡΠΊΠΈΡ
ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ
TEMPLATE
echo "β
Π¨Π°Π±Π»ΠΎΠ½ ΠΊΠΎΠΌΠΌΠΈΡΠ° ΡΠΎΠ·Π΄Π°Π½"
fi
# 2. ΠΠ°ΡΡΡΠΎΠΉΠΊΠ° Π»ΠΎΠΊΠ°Π»ΡΠ½ΠΎΠ³ΠΎ git
git config commit.template .gitmessage.txt
# 3. ΠΠ°ΡΡΡΠΎΠΉΠΊΠ° ΠΏΠΎΠ»Π΅Π·Π½ΡΡ
ΠΏΡΠ΅Π²Π΄ΠΎΠ½ΠΈΠΌΠΎΠ²
git config alias.quality-check '!./commit-quality-metrics.sh'
git config alias.cc 'commit --template=.gitmessage.txt'
echo ""
echo "π ΠΠ°ΡΡΡΠΎΠΉΠΊΠ° Π·Π°Π²Π΅ΡΡΠ΅Π½Π°!"
echo ""
echo "Π‘Π»Π΅Π΄ΡΡΡΠΈΠ΅ ΡΠ°Π³ΠΈ:"
echo "1. ΠΠΎΠΏΡΠΎΠ±ΡΠΉΡΠ΅: git cc"
echo "2. ΠΡΠΎΠ²Π΅ΡΡΡΠ΅ ΠΊΠ°ΡΠ΅ΡΡΠ²ΠΎ: git quality-check"
echo "3. ΠΡΠΎΡΠΈΡΠ°ΠΉΡΠ΅ ΡΡΠΊΠΎΠ²ΠΎΠ΄ΡΡΠ²ΠΎ: cat TEAM_COMMIT_GUIDE.md"
EOF
chmod +x setup-team-standards.sh
echo "π οΈ Π‘ΠΊΡΠΈΠΏΡ Π½Π°ΡΡΡΠΎΠΉΠΊΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Ρ ΡΠΎΠ·Π΄Π°Π½!"
ΠΠ±ΡΡΡΠ½Π΅Π½ΠΈΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄:
cat << 'EOF' > setup-team-standards.sh
- Π½Π°ΡΠΈΠ½Π°Π΅ΠΌ ΡΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΡΠΊΡΠΈΠΏΡΠ°- ΠΠ΅ΡΡ ΠΊΠΎΠ΄ ΠΌΠ΅ΠΆΠ΄Ρ ΡΡΠΎΠΉ ΡΡΡΠΎΠΊΠΎΠΉ ΠΈ
EOF
Π·Π°ΠΏΠΈΡΡΠ²Π°Π΅ΡΡΡ Π² ΡΠ°ΠΉΠ» EOF
- ΠΊΠΎΠ½Π΅Ρ ΡΠΎΠ΄Π΅ΡΠΆΠΈΠΌΠΎΠ³ΠΎ ΡΠΊΡΠΈΠΏΡΠ°chmod +x setup-team-standards.sh
- Π΄Π΅Π»Π°Π΅ΠΌ ΡΠΊΡΠΈΠΏΡ ΠΈΡΠΏΠΎΠ»Π½ΡΠ΅ΠΌΡΠΌecho "π οΈ Π‘ΠΊΡΠΈΠΏΡ..."
- ΠΏΠΎΠ΄ΡΠ²Π΅ΡΠΆΠ΄Π΅Π½ΠΈΠ΅ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ
ΠΠ°ΠΊ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΠΎΠ·Π΄Π°Π½Π½ΡΠΉ ΡΠΊΡΠΈΠΏΡ:
# ΠΠ°ΠΏΡΡΡΠΈΡΡ Π°Π²ΡΠΎΠ½Π°ΡΡΡΠΎΠΉΠΊΡ Π΄Π»Ρ ΠΊΠΎΠΌΠ°Π½Π΄Ρ
./setup-team-standards.sh
π§ ΠΡΠΎΠ³ΠΈ Π΄Π½Ρ
π ΠΠ»ΡΡΠ΅Π²ΡΠ΅ ΠΏΡΠΈΠ½ΡΠΈΠΏΡ:
- Π‘ΡΡΡΠΊΡΡΡΠΈΡΠΎΠ²Π°Π½Π½ΡΠ΅ ΠΊΠΎΠΌΠΌΠΈΡΡ Π΄Π΅Π»Π°ΡΡ ΠΈΡΡΠΎΡΠΈΡ ΠΏΡΠΎΠ΅ΠΊΡΠ° ΡΠΈΡΠ°Π΅ΠΌΠΎΠΉ ΠΈ ΠΏΠΎΠ»Π΅Π·Π½ΠΎΠΉ
- ΠΠ²ΡΠΎΠΌΠ°ΡΠΈΠ·Π°ΡΠΈΡ Π²Π°Π»ΠΈΠ΄Π°ΡΠΈΠΈ ΠΏΡΠ΅Π΄ΠΎΡΠ²ΡΠ°ΡΠ°Π΅Ρ ΠΏΠΎΠΏΠ°Π΄Π°Π½ΠΈΠ΅ Π½Π΅ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅Π½Π½ΡΡ ΠΊΠΎΠΌΠΌΠΈΡΠΎΠ²
- ΠΠΎΠΌΠ°Π½Π΄Π½ΡΠ΅ ΡΡΠ°Π½Π΄Π°ΡΡΡ ΡΡΠΊΠΎΡΡΡΡ Π°Π΄Π°ΠΏΡΠ°ΡΠΈΡ Π½ΠΎΠ²ΡΡ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΎΠ²
- ΠΠ·ΠΌΠ΅ΡΠ΅Π½ΠΈΠ΅ ΠΌΠ΅ΡΡΠΈΠΊ ΠΏΠΎΠΌΠΎΠ³Π°Π΅Ρ ΠΎΡΡΠ»Π΅ΠΆΠΈΠ²Π°ΡΡ ΡΠ»ΡΡΡΠ΅Π½ΠΈΡ ΠΊΠ°ΡΠ΅ΡΡΠ²Π°
- ΠΠ½ΡΡΡΡΠΌΠ΅Π½ΡΡ Π΄ΠΎΠ»ΠΆΠ½Ρ Π±ΡΡΡ ΠΏΡΠΎΡΡΡΠΌΠΈ Π² Π½Π°ΡΡΡΠΎΠΉΠΊΠ΅ ΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠΈ
β ΠΡΠΎΠ²Π΅ΡΠΊΠ° Π³ΠΎΡΠΎΠ²Π½ΠΎΡΡΠΈ:
# ΠΡΡ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ, Π΅ΡΠ»ΠΈ ΡΡΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Ρ Π²ΡΠΏΠΎΠ»Π½ΡΡΡΡΡ Π±Π΅Π· ΠΎΡΠΈΠ±ΠΎΠΊ:
git quality-check # ΠΡΠΎΠ²Π΅ΡΠΊΠ° ΠΊΠ°ΡΠ΅ΡΡΠ²Π° ΠΊΠΎΠΌΠΌΠΈΡΠΎΠ²
git team-stats # Π‘ΡΠ°ΡΠΈΡΡΠΈΠΊΠ° ΠΊΠΎΠΌΠ°Π½Π΄Ρ
./commit-quality-metrics.sh # ΠΠ°Π½Π΅Π»Ρ ΠΌΠ΅ΡΡΠΈΠΊ
./analyze-chaos.sh # ΠΠ½Π°Π»ΠΈΠ· ΠΏΡΠΎΠ±Π»Π΅ΠΌ (Π΅ΡΠ»ΠΈ Π΅ΡΡΡ)
π ΠΠΎΠΌΠΌΠΈΡ Π΄Π»Ρ ΠΏΠΎΡΡΡΠΎΠ»ΠΈΠΎ
Π€ΠΈΠ½Π°Π»ΡΠ½ΡΠΉ ΠΊΠΎΠΌΠΌΠΈΡ Π΄Π½Ρ ΡΠΎ Π²ΡΠ΅ΠΌΠΈ Π΄ΠΎΡΡΠΈΠΆΠ΅Π½ΠΈΡΠΌΠΈ:
# ΠΠΎΠ±Π°Π²Π»ΡΠ΅ΠΌ Π²ΡΠ΅ ΡΠΎΠ·Π΄Π°Π½Π½ΡΠ΅ ΡΠ°ΠΉΠ»Ρ ΠΈ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΡ
git add .
# Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ ΡΡΡΡΠΊΡΡΡΠΈΡΠΎΠ²Π°Π½Π½ΡΠΉ ΠΊΠΎΠΌΠΌΠΈΡ Ρ ΠΈΠ·ΠΌΠ΅ΡΠΈΠΌΡΠΌΠΈ ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠ°ΠΌΠΈ
git commit -m "feat(standards): ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°ΡΡ ΠΊΠΎΠΌΠΏΠ»Π΅ΠΊΡΠ½ΡΡ ΡΠΈΡΡΠ΅ΠΌΡ ΠΊΠ°ΡΠ΅ΡΡΠ²Π° ΠΊΠΎΠΌΠΌΠΈΡΠΎΠ²
- Π‘ΠΎΠ·Π΄Π°Π½Π° Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠ°Ρ Π²Π°Π»ΠΈΠ΄Π°ΡΠΈΡ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ ΠΊΠΎΠΌΠΌΠΈΡΠΎΠ² Ρ Husky + Commitlint
- Π Π°Π·ΡΠ°Π±ΠΎΡΠ°Π½ΠΎ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠ΅ ΡΡΠΊΠΎΠ²ΠΎΠ΄ΡΡΠ²ΠΎ ΠΏΠΎ ΡΠ°Π±Π»ΠΎΠ½Π°ΠΌ ΠΊΠΎΠΌΠΌΠΈΡΠΎΠ² ΠΈ Π°Π΄Π°ΠΏΡΠ°ΡΠΈΠΈ
- Π Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π° ΠΏΠ°Π½Π΅Π»Ρ ΠΌΠ΅ΡΡΠΈΠΊ ΠΊΠ°ΡΠ΅ΡΡΠ²Π° ΠΊΠΎΠΌΠΌΠΈΡΠΎΠ² Ρ Π΄Π΅ΡΠ°Π»ΡΠ½ΠΎΠΉ Π°Π½Π°Π»ΠΈΡΠΈΠΊΠΎΠΉ
- ΠΡΠΎΠ΄Π΅ΠΌΠΎΠ½ΡΡΡΠΈΡΠΎΠ²Π°Π½Π° ΠΎΡΠΈΡΡΠΊΠ° ΠΈΡΡΠΎΡΠΈΠΈ ΡΠ΅ΡΠ΅Π· ΠΈΠ½ΡΠ΅ΡΠ°ΠΊΡΠΈΠ²Π½ΠΎΠ΅ ΠΏΠ΅ΡΠ΅Π±Π°Π·ΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅
- ΠΠ°ΡΡΡΠΎΠ΅Π½Ρ Ρ
ΡΠΊΠΈ ΠΏΡΠ΅Π΄Π²Π°ΡΠΈΡΠ΅Π»ΡΠ½ΠΎΠΉ ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ Π΄Π»Ρ Π²Π°Π»ΠΈΠ΄Π°ΡΠΈΠΈ Π² ΡΠ΅Π°Π»ΡΠ½ΠΎΠΌ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ
ΠΠΎΠ·Π΄Π΅ΠΉΡΡΠ²ΠΈΠ΅:
- ΠΡΠ΅ΠΌΡ ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ ΠΊΠΎΠ΄Π°: -60% (45ΠΌΠΈΠ½ β 15ΠΌΠΈΠ½)
- Π’ΠΎΡΠ½ΠΎΡΡΡ git bisect: +75% (20% β 95%)
- ΠΠ΄Π°ΠΏΡΠ°ΡΠΈΡ ΠΊΠΎΠΌΠ°Π½Π΄Ρ: -50% ΡΠΎΠΊΡΠ°ΡΠ΅Π½ΠΈΠ΅ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ
- Π£ΡΠΏΠ΅ΡΠ½ΠΎΡΡΡ cherry-pick: +60% (30% β 90%)
ΠΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΠ΅Ρ ΠΏΠΎΠ»Π½ΠΎΡΠ΅Π½Π½ΡΠΉ enterprise-ready ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠ°ΡΠΈΠΉ Π΄Π»Ρ
ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠ΅Π½ΠΈΡ ΠΊΠ°ΡΠ΅ΡΡΠ²Π° ΠΊΠΎΠΌΠΌΠΈΡΠΎΠ² ΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠΈ.
Closes: PORTFOLIO-001"
π§ ΠΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈΠ΅ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΡ
Π‘ΠΎΠ·Π΄Π°Π½Π½ΡΠ΅ ΡΠΊΡΠΈΠΏΡΡ:
analyze-chaos.sh
- Π΄ΠΈΠ°Π³Π½ΠΎΡΡΠΈΠΊΠ° ΠΏΡΠΎΠ±Π»Π΅ΠΌ Π² ΠΈΡΡΠΎΡΠΈΠΈ ΠΊΠΎΠΌΠΌΠΈΡΠΎΠ²commit-quality-metrics.sh
- ΠΏΠ°Π½Π΅Π»Ρ ΠΌΠΎΠ½ΠΈΡΠΎΡΠΈΠ½Π³Π° ΠΊΠ°ΡΠ΅ΡΡΠ²Π°setup-team-standards.sh
- Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠ°Ρ Π½Π°ΡΡΡΠΎΠΉΠΊΠ° Π΄Π»Ρ ΠΊΠΎΠΌΠ°Π½Π΄Ρ
Git ΠΏΡΠ΅Π²Π΄ΠΎΠ½ΠΈΠΌΡ:
git quality-check
- ΠΏΡΠΎΠ²Π΅ΡΠΊΠ° ΠΏΠΎΡΠ»Π΅Π΄Π½ΠΈΡ ΠΊΠΎΠΌΠΌΠΈΡΠΎΠ²git team-stats
- ΡΡΠ°ΡΠΈΡΡΠΈΠΊΠ° ΠΊΠΎΠΌΠ°Π½Π΄Ρgit cc
- ΠΊΠΎΠΌΠΌΠΈΡ Ρ ΡΠ°Π±Π»ΠΎΠ½ΠΎΠΌ
π ΠΠΎΡΡΠΈΠΆΠ΅Π½ΠΈΡ ΡΠ°Π·Π±Π»ΠΎΠΊΠΈΡΠΎΠ²Π°Π½Ρ
ΠΠΎΡΡΠΈΠΆΠ΅Π½ΠΈΠ΅ | ΠΠΏΠΈΡΠ°Π½ΠΈΠ΅ | Π‘ΡΠ°ΡΡΡ |
---|---|---|
π§Ή Cleanup Master | ΠΡΠΈΡΡΠΈΠ» Ρ Π°ΠΎΡΠΈΡΠ½ΡΡ ΠΈΡΡΠΎΡΠΈΡ ΠΏΡΠΎΠ΅ΠΊΡΠ° | β |
π€ Automation Pro | ΠΠ°ΡΡΡΠΎΠΈΠ» Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΡΡ Π²Π°Π»ΠΈΠ΄Π°ΡΠΈΡ | β |
π Metrics Guru | Π‘ΠΎΠ·Π΄Π°Π» ΡΠΈΡΡΠ΅ΠΌΡ ΠΈΠ·ΠΌΠ΅ΡΠ΅Π½ΠΈΡ ΠΊΠ°ΡΠ΅ΡΡΠ²Π° | β |
π₯ Team Leader | Π Π°Π·ΡΠ°Π±ΠΎΡΠ°Π» ΠΊΠΎΠΌΠ°Π½Π΄Π½ΡΠ΅ ΡΡΠ°Π½Π΄Π°ΡΡΡ | β |
π οΈ Tool Creator | Π‘ΠΎΠ·Π΄Π°Π» ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΡ Π΄Π»Ρ ΠΊΠΎΠΌΠ°Π½Π΄Ρ | β |
β¨ ΠΠΎΠ·Π΄ΡΠ°Π²Π»ΡΠ΅ΠΌ Ρ Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΠ΅ΠΌ ΠΠ΅ΡΠ²ΠΎΠ³ΠΎ ΠΠ½Ρ!
ΠΡ ΡΡΠΏΠ΅ΡΠ½ΠΎ ΡΡΠ°Π½ΡΡΠΎΡΠΌΠΈΡΠΎΠ²Π°Π»ΠΈ Ρ Π°ΠΎΡΠΈΡΠ½ΡΡ ΠΈΡΡΠΎΡΠΈΡ ΠΊΠΎΠΌΠΌΠΈΡΠΎΠ² Π² ΠΏΡΠΎΡΠ΅ΡΡΠΈΠΎΠ½Π°Π»ΡΠ½ΡΠΉ ΡΡΠ°Π½Π΄Π°ΡΡ ΠΊΠΎΠΌΠ°Π½Π΄Ρ. Π‘ΠΎΠ·Π΄Π°Π½Π½ΡΠ΅ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΡ Π³ΠΎΡΠΎΠ²Ρ ΠΊ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ Π² ΡΠ΅Π°Π»ΡΠ½ΡΡ ΠΏΡΠΎΠ΅ΠΊΡΠ°Ρ ΠΈ Π·Π½Π°ΡΠΈΡΠ΅Π»ΡΠ½ΠΎ ΡΠ»ΡΡΡΠ°Ρ quality gate ΠΏΡΠΎΡΠ΅ΡΡΡ Π²Π°ΡΠ΅ΠΉ ΠΊΠΎΠΌΠ°Π½Π΄Ρ.
π― ΠΡΠΎΠ²Π΅ΡΠΊΠ° Π³ΠΎΡΠΎΠ²Π½ΠΎΡΡΠΈ ΠΊ ΡΠ»Π΅Π΄ΡΡΡΠ΅ΠΌΡ ΡΡΠ°ΠΏΡ
ΠΡΠΏΠΎΠ»Π½ΠΈΡΠ΅ ΡΡΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Ρ, ΡΡΠΎΠ±Ρ ΡΠ±Π΅Π΄ΠΈΡΡΡΡ Π² Π³ΠΎΡΠΎΠ²Π½ΠΎΡΡΠΈ:
# Π’Π΅ΡΡ 1: Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ feature Π²Π΅ΡΠΊΠΈ
git checkout -b feature/test-merge-prep
echo "// ΠΠΎΠ΄Π³ΠΎΡΠΎΠ²ΠΊΠ° ΠΊ ΠΈΠ·ΡΡΠ΅Π½ΠΈΡ merge strategies" > merge-test.js
git add . && git commit -m "feat(prep): ΠΏΠΎΠ΄Π³ΠΎΡΠΎΠ²ΠΊΠ° ΠΊ ΠΈΠ·ΡΡΠ΅Π½ΠΈΡ merge strategies"
# Π’Π΅ΡΡ 2: ΠΠΎΠ½ΠΈΠΌΠ°Π½ΠΈΠ΅ ΡΠ΅ΠΊΡΡΠ΅ΠΉ ΠΈΡΡΠΎΡΠΈΠΈ
git log --oneline --graph -5
# Π’Π΅ΡΡ 3: ΠΠΎΠ·Π²ΡΠ°Ρ Π½Π° main
git checkout main
β ΠΡΠΈΠΌΠ΅ΡΠ°Π½ΠΈΠ΅
ΠΡΠ»ΠΈ Π²ΡΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ Π²ΡΠΏΠΎΠ»Π½ΠΈΠ»ΠΈΡΡ Π±Π΅Π· ΠΎΡΠΈΠ±ΠΎΠΊ - Π²Ρ Π³ΠΎΡΠΎΠ²Ρ ΠΊ ΡΠ»Π΅Π΄ΡΡΡΠ΅ΠΌΡ ΡΡΠ°ΠΏΡ!
π‘ ΠΠΎΠΌΠ°ΡΠ½Π΅Π΅ Π·Π°Π΄Π°Π½ΠΈΠ΅
βΉοΈ ΠΡΠΈΠΌΠ΅ΡΠ°Π½ΠΈΠ΅
ΠΠΎΠ΄Π³ΠΎΡΠΎΠ²ΠΈΡΠ΅Π»ΡΠ½ΡΠ΅ ΡΠΏΡΠ°ΠΆΠ½Π΅Π½ΠΈΡ (15 ΠΌΠΈΠ½ΡΡ):
1. Π‘ΠΎΠ·Π΄Π°ΠΉΡΠ΅ ΠΊΠΎΠ½ΡΠ»ΠΈΠΊΡΠ½ΡΡ ΡΠΈΡΡΠ°ΡΠΈΡ
# Π‘ΠΎΠ·Π΄Π°ΠΉΡΠ΅ Π΄Π²Π΅ Π²Π΅ΡΠΊΠΈ ΠΈΠ·ΠΌΠ΅Π½ΡΡΡΠΈΠ΅ ΠΎΠ΄ΠΈΠ½ ΡΠ°ΠΉΠ»
git checkout -b feature/auth-update
echo "// OAuth integration" >> auth.js
git commit -am "feat(auth): add OAuth"
git checkout main
echo "// 2FA integration" >> auth.js
git commit -am "feat(auth): add 2FA"
2. ΠΠ·ΡΡΠΈΡΠ΅ ΠΈΡΡΠΎΡΠΈΡ
git log --graph --oneline --all -10
3. ΠΠΎΠΏΡΠΎΠ±ΡΠΉΡΠ΅ ΠΏΡΠΎΡΡΠΎΠ΅ ΡΠ»ΠΈΡΠ½ΠΈΠ΅
git merge feature/auth-update
# Π£Π²ΠΈΠ΄ΠΈΡΠ΅ conflict - ΠΠ ΡΠ΅ΡΠ°ΠΉΡΠ΅ Π΅Π³ΠΎ!
git merge --abort
π― ΠΠΎΡΠΎΠ²Π½ΠΎΡΡΡ ΠΊ ΡΠ΅Π°Π»ΡΠ½ΡΠΌ challenge
ΠΡΠ°ΠΏ | ΠΠ°Π²ΡΠΊ | Π‘ΡΠ°ΡΡΡ |
---|---|---|
ΠΠ΅Π½Ρ 1: Commit Quality | β Π‘ΡΡΡΠΊΡΡΡΠΈΡΠΎΠ²Π°Π½Π½ΡΠ΅ ΠΊΠΎΠΌΠΌΠΈΡΡ | ΠΡΠ²ΠΎΠ΅Π½ |
β ΠΠΎΠ½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π²Π΅ΡΠΎΠΊ | ΠΡΠ²ΠΎΠ΅Π½ | |
β οΈ Merge conflicts | Π ΠΈΠ·ΡΡΠ΅Π½ΠΈΡ | |
ΠΠ΅Π½Ρ 2: Merge Strategies | π Π ΠΏΡΠΎΡΠ΅ΡΡΠ΅ | - |
β οΈ ΠΡΠΈΠΌΠ΅ΡΠ°Π½ΠΈΠ΅
ΠΠ°ΠΆΠ½ΠΎ: Π‘Π»Π΅Π΄ΡΡΡΠΈΠΉ ΡΡΠ°ΠΏ ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ ΡΠ»ΠΎΠΆΠ½ΡΠ΅ ΡΡΠ΅Π½Π°ΡΠΈΠΈ Ρ:
- 4 ΠΊΠΎΠ½ΡΠ»ΠΈΠΊΡΡΡΡΠΈΠΌΠΈ feature Π²Π΅ΡΠΊΠ°ΠΌΠΈ
- Enterprise-level merge hell
- Π Π΅Π°Π»ΡΠ½ΡΠΌΠΈ business ΠΌΠ΅ΡΡΠΈΠΊΠ°ΠΌΠΈ
Π£Π±Π΅Π΄ΠΈΡΠ΅ΡΡ ΡΡΠΎ ΠΊΠΎΠΌΡΠΎΡΡΠ½ΠΎ ΡΠ°Π±ΠΎΡΠ°Π΅ΡΠ΅ Ρ Π±Π°Π·ΠΎΠ²ΡΠΌΠΈ git ΠΊΠΎΠΌΠ°Π½Π΄Π°ΠΌΠΈ!
π ΠΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΡΠ΅ ΡΠ΅ΡΡΡΡΡ
ΠΠΎΠ»Π΅Π·Π½ΡΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ Π΄Π»Ρ ΠΈΠ·ΡΡΠ΅Π½ΠΈΡ:
git log --graph --oneline # ΠΠΈΠ·ΡΠ°Π»ΠΈΠ·Π°ΡΠΈΡ ΠΈΡΡΠΎΡΠΈΠΈ
git show-branch # Π‘ΡΠ°Π²Π½Π΅Π½ΠΈΠ΅ Π²Π΅ΡΠΎΠΊ
git merge-base # ΠΠΎΠΈΡΠΊ ΠΎΠ±ΡΠ΅Π³ΠΎ ΠΏΡΠ΅Π΄ΠΊΠ°
git diff HEAD~1 HEAD # Π‘ΡΠ°Π²Π½Π΅Π½ΠΈΠ΅ ΠΊΠΎΠΌΠΌΠΈΡΠΎΠ²
π― Π‘Π»Π΅Π΄ΡΡΡΠΈΠΉ ΡΡΠΎΠΊ: ΠΠ΅Π½Ρ 2: Merge Hell β Rebase Workflow - Π½Π°ΡΡΠΈΠΌΡΡ ΡΠ΅ΡΠ°ΡΡ ΠΊΠΎΠ½ΡΠ»ΠΈΠΊΡΡ ΡΠ»ΠΈΡΠ½ΠΈΡ ΠΈ ΡΠΎΠ·Π΄Π°Π²Π°ΡΡ Π»ΠΈΠ½Π΅ΠΉΠ½ΡΡ ΠΈΡΡΠΎΡΠΈΡ ΠΏΡΠΎΠ΅ΠΊΡΠ°. Claude
π± Telegram: @DevITWay
π Π‘Π°ΠΉΡ: devopsway.ru