Integration
Integrate Git with IDEs, CI/CD pipelines, automation tools, and development workflows for enhanced productivity.
IDE Integration
Visual Studio Code
Built-in Git Features:
# Git integration is built into VS Code
# Features:
# - Source control sidebar
# - Diff view
# - Commit history
# - Branch switching
# - Merge conflict resolution
VS Code Git Commands:
# Command palette (Ctrl+Shift+P):
Git: Clone
Git: Commit
Git: Pull
Git: Push
Git: Create Branch
Git: Checkout to
Git: Merge Branch
Git: Stash
Git: View History
VS Code Git Configuration:
// settings.json
{
"git.enableSmartCommit": true,
"git.autofetch": true,
"git.confirmSync": false,
"git.enableStatusBarSync": true,
"git.showInlineOpenFileAction": false,
"git.defaultCloneDirectory": "~/projects",
"git.rebaseWhenSync": true
}
Useful VS Code Extensions:
- GitLens - Enhanced Git features
- Git History - View file history
- Git Graph - Visual commit graph
- GitHub Pull Requests - PR management
- GitKraken Glow - Code review
JetBrains IDEs
IntelliJ IDEA / WebStorm / PyCharm:
# VCS integration features:
# - VCS menu and toolbar
# - Local history
# - Changelist management
# - Shelf for temporary changes
# - Built-in merge tool
# - Annotate (blame) view
JetBrains Git Operations:
# VCS menu operations:
VCS > Git > Clone
VCS > Git > Add
VCS > Commit
VCS > Git > Push
VCS > Git > Pull
VCS > Git > Branches
VCS > Git > Merge
VCS > Git > Rebase
JetBrains Configuration:
# Settings > Version Control > Git
# Configure:
# - Git executable path
# - SSH executable
# - GPG executable
# - Update method (merge/rebase)
# - Auto-update info
Eclipse
EGit Plugin:
# Eclipse Git integration via EGit
# Features:
# - Git repositories view
# - Git staging view
# - History view
# - Synchronize view
# - Merge tool
Eclipse Git Operations:
# Team menu operations:
Team > Share Project > Git
Team > Commit
Team > Push Branch
Team > Pull
Team > Switch To > Branch
Team > Merge
Team > Rebase
CI/CD Integration
GitHub Actions
Basic Workflow:
# .github/workflows/main.yml
name: CI/CD Pipeline
on:
push:
branches: [main, develop]
pull_request:
branches: [main]
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
with:
fetch-depth: 0 # Fetch full history
- name: Setup Node.js
uses: actions/setup-node@v3
with:
node-version: '18'
cache: 'npm'
- name: Install dependencies
run: npm ci
- name: Run tests
run: npm test
- name: Run linting
run: npm run lint
- name: Build project
run: npm run build
Advanced Git Operations:
# .github/workflows/advanced.yml
name: Advanced Git Operations
on:
push:
branches: [main]
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
with:
fetch-depth: 0
token: ${{ secrets.GITHUB_TOKEN }}
- name: Get commit info
id: commit
run: |
echo "sha=$(git rev-parse --short HEAD)" >> $GITHUB_OUTPUT
echo "message=$(git log -1 --pretty=format:'%s')" >> $GITHUB_OUTPUT
echo "author=$(git log -1 --pretty=format:'%an')" >> $GITHUB_OUTPUT
- name: Check for changes
id: changes
run: |
if git diff --quiet HEAD^ HEAD -- src/; then
echo "changed=false" >> $GITHUB_OUTPUT
else
echo "changed=true" >> $GITHUB_OUTPUT
fi
- name: Deploy if changed
if: steps.changes.outputs.changed == 'true'
run: |
echo "Deploying commit ${{ steps.commit.outputs.sha }}"
echo "Message: ${{ steps.commit.outputs.message }}"
echo "Author: ${{ steps.commit.outputs.author }}"
# Deploy script here
GitLab CI
GitLab CI Configuration:
# .gitlab-ci.yml
stages:
- test
- build
- deploy
variables:
GIT_DEPTH: 0 # Clone full repository
before_script:
- echo "Current branch: $CI_COMMIT_REF_NAME"
- echo "Commit SHA: $CI_COMMIT_SHA"
- echo "Commit message: $CI_COMMIT_MESSAGE"
test:
stage: test
script:
- npm install
- npm test
only:
- merge_requests
- main
build:
stage: build
script:
- npm run build
artifacts:
paths:
- dist/
only:
- main
deploy:
stage: deploy
script:
- echo "Deploying to production"
- ./deploy.sh
only:
- main
when: manual
Jenkins Pipeline
Jenkinsfile Example:
// Jenkinsfile
pipeline {
agent any
environment {
GIT_COMMIT_SHORT = sh(
script: "git rev-parse --short HEAD",
returnStdout: true
).trim()
GIT_BRANCH_NAME = sh(
script: "git rev-parse --abbrev-ref HEAD",
returnStdout: true
).trim()
}
stages {
stage('Checkout') {
steps {
checkout scm
sh 'git log -1 --oneline'
}
}
stage('Test') {
steps {
sh 'npm install'
sh 'npm test'
}
}
stage('Build') {
steps {
sh 'npm run build'
}
}
stage('Deploy') {
when {
branch 'main'
}
steps {
sh "echo 'Deploying commit ${GIT_COMMIT_SHORT}'"
sh './deploy.sh'
}
}
}
post {
always {
echo "Pipeline completed for ${GIT_BRANCH_NAME}"
}
}
}
Automation Tools
Git Hooks
Pre-commit Hooks:
#!/bin/sh
# .git/hooks/pre-commit
# Run tests
npm test
if [ $? -ne 0 ]; then
echo "Tests failed. Commit aborted."
exit 1
fi
# Run linting
npm run lint
if [ $? -ne 0 ]; then
echo "Linting failed. Commit aborted."
exit 1
fi
# Check for forbidden words
if grep -r "TODO\|FIXME\|console.log" --include="*.js" src/; then
echo "Found TODO, FIXME, or console.log in code."
echo "Please remove before committing."
exit 1
fi
Post-commit Hooks:
#!/bin/sh
# .git/hooks/post-commit
# Send notification
COMMIT_MSG=$(git log -1 --pretty=format:'%s')
AUTHOR=$(git log -1 --pretty=format:'%an')
# Send to Slack
curl -X POST -H 'Content-type: application/json' \
--data "{\"text\":\"New commit by ${AUTHOR}: ${COMMIT_MSG}\"}" \
$SLACK_WEBHOOK_URL
Pre-push Hooks:
#!/bin/sh
# .git/hooks/pre-push
protected_branch='main'
current_branch=$(git symbolic-ref HEAD | sed -e 's,.*/\(.*\),\1,')
# Prevent direct push to main
if [ $current_branch = $protected_branch ]; then
echo "Direct push to $protected_branch is not allowed."
echo "Please use pull requests."
exit 1
fi
# Run full test suite
npm run test:full
if [ $? -ne 0 ]; then
echo "Full test suite failed. Push aborted."
exit 1
fi
Husky (Git Hooks Manager)
Installation:
# Install husky
npm install --save-dev husky
# Initialize husky
npx husky install
# Add to package.json
npm pkg set scripts.prepare="husky install"
Configuration:
# Add pre-commit hook
npx husky add .husky/pre-commit "npm test"
# Add commit-msg hook
npx husky add .husky/commit-msg 'npx --no-install commitlint --edit "$1"'
# Add pre-push hook
npx husky add .husky/pre-push "npm run test:full"
Package.json Integration:
{
"scripts": {
"prepare": "husky install",
"test": "jest",
"test:full": "jest --coverage",
"lint": "eslint src/",
"lint:fix": "eslint src/ --fix"
},
"husky": {
"hooks": {
"pre-commit": "lint-staged",
"commit-msg": "commitlint -E HUSKY_GIT_PARAMS"
}
}
}
Development Workflow Integration
Commit Message Standards
Conventional Commits:
# Install commitizen
npm install --save-dev commitizen cz-conventional-changelog
# Configure commitizen
echo '{ "path": "cz-conventional-changelog" }' > .czrc
# Add npm script
# package.json
{
"scripts": {
"commit": "cz"
}
}
# Use commitizen
npm run commit
Commitlint Configuration:
// commitlint.config.js
module.exports = {
extends: ['@commitlint/config-conventional'],
rules: {
'type-enum': [
2,
'always',
['feat', 'fix', 'docs', 'style', 'refactor', 'test', 'chore'],
],
'subject-max-length': [2, 'always', 50],
'body-max-line-length': [2, 'always', 72],
},
};
Code Quality Integration
ESLint Integration:
# Install ESLint
npm install --save-dev eslint
# Configure ESLint
npx eslint --init
# Add Git integration
# .eslintrc.js
module.exports = {
env: {
node: true,
es2021: true
},
extends: ['eslint:recommended'],
rules: {
'no-console': 'warn',
'no-debugger': 'error'
}
};
Prettier Integration:
# Install Prettier
npm install --save-dev prettier
# Configure Prettier
# .prettierrc
{
"semi": true,
"trailingComma": "es5",
"singleQuote": true,
"printWidth": 80
}
# Git integration
# .prettierignore
node_modules/
dist/
.git/
Lint-staged
Configuration:
# Install lint-staged
npm install --save-dev lint-staged
# Configure lint-staged
# package.json
{
"lint-staged": {
"*.js": ["eslint --fix", "prettier --write"],
"*.{json,md}": ["prettier --write"],
"*.css": ["stylelint --fix", "prettier --write"]
}
}
# Add to husky
npx husky add .husky/pre-commit "npx lint-staged"
API Integration
GitHub API
Using GitHub CLI:
# Install GitHub CLI
# macOS: brew install gh
# Linux: apt install gh
# Authenticate
gh auth login
# Repository operations
gh repo create my-project
gh repo clone user/repo
gh repo fork user/repo
# Issue operations
gh issue create --title "Bug report" --body "Description"
gh issue list
gh issue close 123
# Pull request operations
gh pr create --title "Add feature" --body "Description"
gh pr list
gh pr merge 123
GitHub API with curl:
# Get repository info
curl -H "Authorization: token $GITHUB_TOKEN" \
https://api.github.com/repos/user/repo
# Create issue
curl -X POST \
-H "Authorization: token $GITHUB_TOKEN" \
-H "Content-Type: application/json" \
-d '{"title":"Bug report","body":"Description"}' \
https://api.github.com/repos/user/repo/issues
# List commits
curl -H "Authorization: token $GITHUB_TOKEN" \
https://api.github.com/repos/user/repo/commits
GitLab API
GitLab API Examples:
# Get project info
curl -H "PRIVATE-TOKEN: $GITLAB_TOKEN" \
https://gitlab.com/api/v4/projects/123
# Create merge request
curl -X POST \
-H "PRIVATE-TOKEN: $GITLAB_TOKEN" \
-H "Content-Type: application/json" \
-d '{"source_branch":"feature","target_branch":"main","title":"Add feature"}' \
https://gitlab.com/api/v4/projects/123/merge_requests
# List commits
curl -H "PRIVATE-TOKEN: $GITLAB_TOKEN" \
https://gitlab.com/api/v4/projects/123/repository/commits
Monitoring and Observability
Git Metrics
Repository Metrics Script:
#!/bin/bash
# git-metrics.sh
# Basic statistics
echo "Repository Statistics:"
echo "====================="
echo "Total commits: $(git rev-list --all --count)"
echo "Total branches: $(git branch -a | wc -l)"
echo "Total contributors: $(git shortlog -sn | wc -l)"
echo "Repository size: $(du -sh .git | cut -f1)"
# Recent activity
echo -e "\nRecent Activity:"
echo "==============="
echo "Commits this week: $(git log --since='1 week ago' --oneline | wc -l)"
echo "Commits this month: $(git log --since='1 month ago' --oneline | wc -l)"
# Top contributors
echo -e "\nTop Contributors:"
echo "================"
git shortlog -sn | head -5
# Branch activity
echo -e "\nActive Branches:"
echo "==============="
git for-each-ref --sort=-committerdate refs/heads/ \
--format='%(committerdate:short) %(refname:short)' | head -10
Integration with Monitoring Tools
Prometheus Integration:
# Export Git metrics for Prometheus
#!/bin/bash
# git-prometheus-exporter.sh
REPO_PATH="/path/to/repo"
METRICS_FILE="/tmp/git-metrics.prom"
cd $REPO_PATH
# Repository size
REPO_SIZE=$(du -sb .git | cut -f1)
echo "git_repository_size_bytes{repo=\"$(basename $PWD)\"} $REPO_SIZE" > $METRICS_FILE
# Commit count
COMMIT_COUNT=$(git rev-list --all --count)
echo "git_total_commits{repo=\"$(basename $PWD)\"} $COMMIT_COUNT" >> $METRICS_FILE
# Recent commits
RECENT_COMMITS=$(git log --since='1 week ago' --oneline | wc -l)
echo "git_recent_commits{repo=\"$(basename $PWD)\",period=\"week\"} $RECENT_COMMITS" >> $METRICS_FILE
# Branch count
BRANCH_COUNT=$(git branch -a | wc -l)
echo "git_total_branches{repo=\"$(basename $PWD)\"} $BRANCH_COUNT" >> $METRICS_FILE
Troubleshooting Integration Issues
Common Problems
-
IDE not detecting Git repository
# Check if .git directory exists
ls -la .git
# Reinitialize if needed
git init
# Check IDE Git settings
# Ensure Git executable path is correct -
CI/CD not triggering
# Check webhook configuration
# Verify branch protection rules
# Check CI configuration file syntax
# Test webhook locally
curl -X POST -H "Content-Type: application/json" \
-d '{"ref":"refs/heads/main"}' \
https://your-ci-webhook-url -
Hooks not executing
# Check hook permissions
chmod +x .git/hooks/pre-commit
# Verify hook syntax
bash -n .git/hooks/pre-commit
# Test hook manually
.git/hooks/pre-commit
Debug Integration
# Debug Git operations
GIT_TRACE=1 git push origin main
# Debug SSH connections
GIT_SSH_COMMAND="ssh -v" git push origin main
# Debug HTTP operations
GIT_CURL_VERBOSE=1 git push origin main
Best Practices
Integration Guidelines
- Automate repetitive tasks - Use hooks and CI/CD
- Maintain consistency - Standardize tools and workflows
- Monitor performance - Track repository and build metrics
- Document integrations - Keep setup instructions current
- Test integrations - Verify tools work together
Security Considerations
- Protect secrets - Use secure credential storage
- Validate inputs - Check webhook payloads
- Limit permissions - Use least privilege principle
- Monitor access - Track API usage and authentication
- Regular updates - Keep tools and dependencies current
Performance Optimization
- Cache dependencies - Speed up CI/CD builds
- Parallel execution - Run tests and builds concurrently
- Incremental operations - Only process changed files
- Optimize clones - Use shallow clones when possible
- Monitor resource usage - Track build times and costs
See Configuration for tool-specific settings and Performance for optimization techniques.