243 lines
7.2 KiB
Markdown
243 lines
7.2 KiB
Markdown
# Clean Branches Command
|
|
|
|
Clean up merged and stale git branches
|
|
|
|
## Instructions
|
|
|
|
Follow this systematic approach to clean up git branches: **$ARGUMENTS**
|
|
|
|
1. **Repository State Analysis**
|
|
- Check current branch and uncommitted changes
|
|
- List all local and remote branches
|
|
- Identify the main/master branch name
|
|
- Review recent branch activity and merge history
|
|
|
|
```bash
|
|
# Check current status
|
|
git status
|
|
git branch -a
|
|
git remote -v
|
|
|
|
# Check main branch name
|
|
git symbolic-ref refs/remotes/origin/HEAD | sed 's@^refs/remotes/origin/@@'
|
|
```
|
|
|
|
2. **Safety Precautions**
|
|
- Ensure working directory is clean
|
|
- Switch to main/master branch
|
|
- Pull latest changes from remote
|
|
- Create backup of current branch state if needed
|
|
|
|
```bash
|
|
# Ensure clean state
|
|
git stash push -m "Backup before branch cleanup"
|
|
git checkout main # or master
|
|
git pull origin main
|
|
```
|
|
|
|
3. **Identify Merged Branches**
|
|
- List branches that have been merged into main
|
|
- Exclude protected branches (main, master, develop)
|
|
- Check both local and remote merged branches
|
|
- Verify merge status to avoid accidental deletion
|
|
|
|
```bash
|
|
# List merged local branches
|
|
git branch --merged main | grep -v "main\\|master\\|develop\\|\\*"
|
|
|
|
# List merged remote branches
|
|
git branch -r --merged main | grep -v "main\\|master\\|develop\\|HEAD"
|
|
```
|
|
|
|
4. **Identify Stale Branches**
|
|
- Find branches with no recent activity
|
|
- Check last commit date for each branch
|
|
- Identify branches older than specified timeframe (e.g., 30 days)
|
|
- Consider branch naming patterns for feature/hotfix branches
|
|
|
|
```bash
|
|
# List branches by last commit date
|
|
git for-each-ref --format='%(committerdate) %(authorname) %(refname)' --sort=committerdate refs/heads
|
|
|
|
# Find branches older than 30 days
|
|
git for-each-ref --format='%(refname:short) %(committerdate)' refs/heads | awk '$2 < "'$(date -d '30 days ago' '+%Y-%m-%d')'"'
|
|
```
|
|
|
|
5. **Interactive Branch Review**
|
|
- Review each branch before deletion
|
|
- Check if branch has unmerged changes
|
|
- Verify branch purpose and status
|
|
- Ask for confirmation before deletion
|
|
|
|
```bash
|
|
# Check for unmerged changes
|
|
git log main..branch-name --oneline
|
|
|
|
# Show branch information
|
|
git show-branch branch-name main
|
|
```
|
|
|
|
6. **Protected Branch Configuration**
|
|
- Identify branches that should never be deleted
|
|
- Configure protection rules for important branches
|
|
- Document branch protection policies
|
|
- Set up automated protection for new repositories
|
|
|
|
```bash
|
|
# Example protected branches
|
|
PROTECTED_BRANCHES=("main" "master" "develop" "staging" "production")
|
|
```
|
|
|
|
7. **Local Branch Cleanup**
|
|
- Delete merged local branches safely
|
|
- Remove stale feature branches
|
|
- Clean up tracking branches for deleted remotes
|
|
- Update local branch references
|
|
|
|
```bash
|
|
# Delete merged branches (interactive)
|
|
git branch --merged main | grep -v "main\\|master\\|develop\\|\\*" | xargs -n 1 -p git branch -d
|
|
|
|
# Force delete if needed (use with caution)
|
|
git branch -D branch-name
|
|
```
|
|
|
|
8. **Remote Branch Cleanup**
|
|
- Remove merged remote branches
|
|
- Clean up remote tracking references
|
|
- Delete obsolete remote branches
|
|
- Update remote branch information
|
|
|
|
```bash
|
|
# Prune remote tracking branches
|
|
git remote prune origin
|
|
|
|
# Delete remote branch
|
|
git push origin --delete branch-name
|
|
|
|
# Remove local tracking of deleted remote branches
|
|
git branch -dr origin/branch-name
|
|
```
|
|
|
|
9. **Automated Cleanup Script**
|
|
|
|
```bash
|
|
#!/bin/bash
|
|
|
|
# Git branch cleanup script
|
|
set -e
|
|
|
|
# Configuration
|
|
MAIN_BRANCH="main"
|
|
PROTECTED_BRANCHES=("main" "master" "develop" "staging" "production")
|
|
STALE_DAYS=30
|
|
|
|
# Functions
|
|
is_protected() {
|
|
local branch=$1
|
|
for protected in "${PROTECTED_BRANCHES[@]}"; do
|
|
if [[ "$branch" == "$protected" ]]; then
|
|
return 0
|
|
fi
|
|
done
|
|
return 1
|
|
}
|
|
|
|
# Switch to main branch
|
|
git checkout $MAIN_BRANCH
|
|
git pull origin $MAIN_BRANCH
|
|
|
|
# Clean up merged branches
|
|
echo "Cleaning up merged branches..."
|
|
merged_branches=$(git branch --merged $MAIN_BRANCH | grep -v "\\*\\|$MAIN_BRANCH")
|
|
|
|
for branch in $merged_branches; do
|
|
if ! is_protected "$branch"; then
|
|
echo "Deleting merged branch: $branch"
|
|
git branch -d "$branch"
|
|
fi
|
|
done
|
|
|
|
# Prune remote tracking branches
|
|
echo "Pruning remote tracking branches..."
|
|
git remote prune origin
|
|
|
|
echo "Branch cleanup completed!"
|
|
```
|
|
|
|
10. **Team Coordination**
|
|
- Notify team before cleaning shared branches
|
|
- Check if branches are being used by others
|
|
- Coordinate branch cleanup schedules
|
|
- Document branch cleanup procedures
|
|
|
|
11. **Branch Naming Convention Cleanup**
|
|
- Identify branches with non-standard naming
|
|
- Clean up temporary or experimental branches
|
|
- Remove old hotfix and feature branches
|
|
- Enforce consistent naming conventions
|
|
|
|
12. **Verification and Validation**
|
|
- Verify important branches are still present
|
|
- Check that no active work was deleted
|
|
- Validate remote branch synchronization
|
|
- Confirm team members have no issues
|
|
|
|
```bash
|
|
# Verify cleanup results
|
|
git branch -a
|
|
git remote show origin
|
|
```
|
|
|
|
13. **Documentation and Reporting**
|
|
- Document what branches were cleaned up
|
|
- Report any issues or conflicts found
|
|
- Update team documentation about branch lifecycle
|
|
- Create branch cleanup schedule and policies
|
|
|
|
14. **Rollback Procedures**
|
|
- Document how to recover deleted branches
|
|
- Use reflog to find deleted branch commits
|
|
- Create emergency recovery procedures
|
|
- Set up branch restoration scripts
|
|
|
|
```bash
|
|
# Recover deleted branch using reflog
|
|
git reflog --no-merges --since="2 weeks ago"
|
|
git checkout -b recovered-branch commit-hash
|
|
```
|
|
|
|
15. **Automation Setup**
|
|
- Set up automated branch cleanup scripts
|
|
- Configure CI/CD pipeline for branch cleanup
|
|
- Create scheduled cleanup jobs
|
|
- Implement branch lifecycle policies
|
|
|
|
16. **Best Practices Implementation**
|
|
- Establish branch lifecycle guidelines
|
|
- Set up automated merge detection
|
|
- Configure branch protection rules
|
|
- Implement code review requirements
|
|
|
|
**Advanced Cleanup Options:**
|
|
|
|
```bash
|
|
# Clean up all merged branches except protected ones
|
|
git branch --merged main | grep -E "^ (feature|hotfix|bugfix)/" | xargs -n 1 git branch -d
|
|
|
|
# Interactive cleanup with confirmation
|
|
git branch --merged main | grep -v "main\|master\|develop" | xargs -n 1 -p git branch -d
|
|
|
|
# Batch delete remote branches
|
|
git branch -r --merged main | grep origin | grep -v "main\|master\|develop\|HEAD" | cut -d/ -f2- | xargs -n 1 git push origin --delete
|
|
|
|
# Clean up branches older than specific date
|
|
git for-each-ref --format='%(refname:short) %(committerdate:short)' refs/heads | awk '$2 < "2023-01-01"' | cut -d' ' -f1 | xargs -n 1 git branch -D
|
|
```
|
|
|
|
Remember to:
|
|
- Always backup important branches before cleanup
|
|
- Coordinate with team members before deleting shared branches
|
|
- Test cleanup scripts in a safe environment first
|
|
- Document all cleanup procedures and policies
|
|
- Set up regular cleanup schedules to prevent accumulation |