diff --git a/.gitignore b/.gitignore index 611e363..7b94e27 100644 --- a/.gitignore +++ b/.gitignore @@ -35,3 +35,6 @@ crontab/crontab-backups/*/archive/ # backblaze cli # can be downloaded from immich/b2-linux + +# Generated dotfiles - these are created dynamically by bootstrap process +dotfiles/my-aliases.zsh diff --git a/cleanup-alias-tracking.sh b/cleanup-alias-tracking.sh new file mode 100755 index 0000000..f18b71d --- /dev/null +++ b/cleanup-alias-tracking.sh @@ -0,0 +1,176 @@ +#!/bin/bash + +# Cleanup script for removing my-aliases.zsh from git tracking +# This script handles the repository cleanup needed after the alias file +# was changed from tracked to dynamically generated + +set -e + +# Colors for output +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +RED='\033[0;31m' +BLUE='\033[0;34m' +NC='\033[0m' # No Color + +# Script directory and repository root +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +REPO_ROOT="$SCRIPT_DIR" + +echo -e "${BLUE}=== Alias File Tracking Cleanup Script ===${NC}" +echo -e "${YELLOW}This script will remove my-aliases.zsh from git tracking${NC}" +echo -e "${YELLOW}and update .gitignore to prevent future conflicts.${NC}" +echo "" + +# Verify we're in a git repository +if [ ! -d "$REPO_ROOT/.git" ]; then + echo -e "${RED}Error: Not in a git repository${NC}" + echo "Please run this script from the root of your shell repository" + exit 1 +fi + +# Change to repository root +cd "$REPO_ROOT" + +# Check current git status +echo -e "${BLUE}=== Current Git Status ===${NC}" +git status --porcelain + +# Check if my-aliases.zsh is currently tracked +if git ls-files --error-unmatch dotfiles/my-aliases.zsh >/dev/null 2>&1; then + echo -e "${YELLOW}my-aliases.zsh is currently tracked by git${NC}" + ALIASES_TRACKED=true +else + echo -e "${GREEN}my-aliases.zsh is already untracked${NC}" + ALIASES_TRACKED=false +fi + +# Check if .gitignore already has the entry +if grep -q "dotfiles/my-aliases.zsh" .gitignore 2>/dev/null; then + echo -e "${GREEN}.gitignore already contains entry for my-aliases.zsh${NC}" + GITIGNORE_UPDATED=true +else + echo -e "${YELLOW}.gitignore needs to be updated${NC}" + GITIGNORE_UPDATED=false +fi + +# Prompt for confirmation +echo "" +echo -e "${YELLOW}Actions that will be performed:${NC}" +if [ "$ALIASES_TRACKED" = true ]; then + echo " 1. Remove dotfiles/my-aliases.zsh from git tracking" +fi +if [ "$GITIGNORE_UPDATED" = false ]; then + echo " 2. Add dotfiles/my-aliases.zsh to .gitignore" +fi +if [ "$ALIASES_TRACKED" = true ] || [ "$GITIGNORE_UPDATED" = false ]; then + echo " 3. Commit the changes" +else + echo " → No changes needed - cleanup already complete" +fi + +echo "" +read -p "Continue? (y/N): " -n 1 -r +echo +if [[ ! $REPLY =~ ^[Yy]$ ]]; then + echo -e "${YELLOW}Cleanup cancelled${NC}" + exit 0 +fi + +# Step 1: Remove from git tracking if needed +if [ "$ALIASES_TRACKED" = true ]; then + echo -e "${BLUE}=== Removing my-aliases.zsh from git tracking ===${NC}" + + # Check if file exists and remove from tracking + if [ -f "dotfiles/my-aliases.zsh" ]; then + git rm --cached dotfiles/my-aliases.zsh + echo -e "${GREEN}✓ Removed dotfiles/my-aliases.zsh from git tracking${NC}" + else + # File doesn't exist but is tracked - remove from index anyway + git rm --cached dotfiles/my-aliases.zsh 2>/dev/null || true + echo -e "${GREEN}✓ Removed non-existent dotfiles/my-aliases.zsh from git index${NC}" + fi +fi + +# Step 2: Update .gitignore if needed +if [ "$GITIGNORE_UPDATED" = false ]; then + echo -e "${BLUE}=== Updating .gitignore ===${NC}" + + # Check if the "Generated dotfiles" section already exists + if grep -q "Generated dotfiles" .gitignore 2>/dev/null; then + # Add to existing section + if ! grep -q "dotfiles/my-aliases.zsh" .gitignore; then + sed -i '/# Generated dotfiles/a dotfiles/my-aliases.zsh' .gitignore + echo -e "${GREEN}✓ Added entry to existing Generated dotfiles section${NC}" + fi + else + # Create new section + echo "" >> .gitignore + echo "# Generated dotfiles - these are created dynamically by bootstrap process" >> .gitignore + echo "dotfiles/my-aliases.zsh" >> .gitignore + echo -e "${GREEN}✓ Added new Generated dotfiles section to .gitignore${NC}" + fi +fi + +# Step 3: Check if we have changes to commit +if git diff --cached --quiet && git diff --quiet; then + echo -e "${GREEN}=== No changes to commit - cleanup already complete ===${NC}" +else + echo -e "${BLUE}=== Committing changes ===${NC}" + + # Add .gitignore changes if any + git add .gitignore + + # Create commit message + COMMIT_MSG="Remove my-aliases.zsh from tracking, add to .gitignore + +- Remove dotfiles/my-aliases.zsh from git tracking to prevent conflicts +- Add to .gitignore as it's now dynamically generated by bootstrap +- Aliases are now created from my-aliases.zsh.original template" + + # Commit the changes + git commit -m "$COMMIT_MSG" + echo -e "${GREEN}✓ Changes committed successfully${NC}" +fi + +# Step 4: Verify the cleanup +echo -e "${BLUE}=== Verification ===${NC}" + +# Check that file is no longer tracked +if ! git ls-files --error-unmatch dotfiles/my-aliases.zsh >/dev/null 2>&1; then + echo -e "${GREEN}✓ dotfiles/my-aliases.zsh is no longer tracked${NC}" +else + echo -e "${RED}✗ dotfiles/my-aliases.zsh is still tracked${NC}" +fi + +# Check that .gitignore contains the entry +if grep -q "dotfiles/my-aliases.zsh" .gitignore; then + echo -e "${GREEN}✓ .gitignore contains entry for dotfiles/my-aliases.zsh${NC}" +else + echo -e "${RED}✗ .gitignore missing entry for dotfiles/my-aliases.zsh${NC}" +fi + +# Show final git status +echo -e "${BLUE}=== Final Git Status ===${NC}" +git status --porcelain + +# Check if we need to push +if git log --oneline origin/main..HEAD 2>/dev/null | grep -q "Remove my-aliases.zsh"; then + echo "" + echo -e "${YELLOW}=== Push Required ===${NC}" + echo -e "${YELLOW}You have local commits that need to be pushed to the remote repository.${NC}" + echo "Run: ${BLUE}git push origin main${NC}" +elif ! git remote >/dev/null 2>&1; then + echo -e "${YELLOW}No remote repository configured${NC}" +else + echo -e "${GREEN}Repository is up to date with remote${NC}" +fi + +echo "" +echo -e "${GREEN}=== Cleanup Complete! ===${NC}" +echo -e "${GREEN}The my-aliases.zsh file is now properly configured as a generated file.${NC}" +echo "" +echo -e "${YELLOW}Next steps:${NC}" +echo "1. Push changes if needed: ${BLUE}git push origin main${NC}" +echo "2. Run bootstrap/setup on this system to regenerate aliases" +echo "3. The aliases file will now be created dynamically without git conflicts" diff --git a/docs/cleanup-alias-tracking.md b/docs/cleanup-alias-tracking.md new file mode 100644 index 0000000..61fec57 --- /dev/null +++ b/docs/cleanup-alias-tracking.md @@ -0,0 +1,148 @@ +# Alias File Tracking Cleanup + +## Overview + +The `cleanup-alias-tracking.sh` script is designed to clean up the git repository on systems where `dotfiles/my-aliases.zsh` was previously tracked but should now be treated as a dynamically generated file. + +## Problem Context + +Originally, `my-aliases.zsh` was tracked in git, but this caused conflicts when the bootstrap process tried to update it with system-specific aliases. The file is now: + +- **Generated dynamically** from `my-aliases.zsh.original` template +- **Customized per system** (debian vs ubuntu vs fedora) +- **Should not be tracked** in git to prevent conflicts + +## What This Script Does + +1. **Removes git tracking** of `dotfiles/my-aliases.zsh` +2. **Updates .gitignore** to ignore the file +3. **Commits the changes** with a descriptive message +4. **Verifies the cleanup** was successful +5. **Provides next steps** for pushing and regenerating aliases + +## Usage + +### On Each System You Manage + +```bash +# Navigate to your shell repository +cd ~/shell + +# Run the cleanup script +./cleanup-alias-tracking.sh +``` + +### What You'll See + +The script will: +- Show current git status +- Check if the file is currently tracked +- Check if .gitignore already has the entry +- Ask for confirmation before making changes +- Perform the cleanup +- Verify the results + +### Example Output + +``` +=== Alias File Tracking Cleanup Script === +This script will remove my-aliases.zsh from git tracking +and update .gitignore to prevent future conflicts. + +=== Current Git Status === +M dotfiles/my-aliases.zsh + +my-aliases.zsh is currently tracked by git +.gitignore needs to be updated + +Actions that will be performed: + 1. Remove dotfiles/my-aliases.zsh from git tracking + 2. Add dotfiles/my-aliases.zsh to .gitignore + 3. Commit the changes + +Continue? (y/N): y + +=== Removing my-aliases.zsh from git tracking === +✓ Removed dotfiles/my-aliases.zsh from git tracking + +=== Updating .gitignore === +✓ Added new Generated dotfiles section to .gitignore + +=== Committing changes === +✓ Changes committed successfully + +=== Verification === +✓ dotfiles/my-aliases.zsh is no longer tracked +✓ .gitignore contains entry for dotfiles/my-aliases.zsh + +=== Final Git Status === +(clean working directory) + +=== Cleanup Complete! === +``` + +## After Running the Script + +1. **Push the changes** to your repository: + ```bash + git push origin main + ``` + +2. **Regenerate the aliases** on the system: + ```bash + # Run setup to regenerate aliases from template + ~/shell/setup/setup.sh + ``` + +3. **Verify aliases work**: + ```bash + # Source your shell config or start a new terminal + source ~/.zshrc + + # Test aliases + ll # Should work if aliases were generated correctly + ``` + +## Safety Features + +- **Confirmation prompt** before making any changes +- **Git status checks** to show what will be affected +- **Verification steps** to ensure cleanup was successful +- **No data loss** - the script only removes tracking, not the actual file +- **Idempotent** - safe to run multiple times + +## Troubleshooting + +### Script Says "No changes needed" + +This means the cleanup was already done on this system. You can verify by checking: +```bash +git ls-files | grep my-aliases.zsh # Should return nothing +grep "my-aliases.zsh" .gitignore # Should show the ignore entry +``` + +### File Still Shows as Modified + +If `my-aliases.zsh` still shows as modified after cleanup: +1. This is normal - the file exists locally but is now ignored +2. Delete the local file: `rm dotfiles/my-aliases.zsh` +3. Run setup to regenerate: `~/shell/setup/setup.sh` + +### Merge Conflicts on Other Systems + +If you get merge conflicts when pulling: +1. Run this cleanup script first +2. Then pull the latest changes +3. The conflicts should be resolved automatically + +## Files Modified + +- **dotfiles/my-aliases.zsh** - Removed from git tracking +- **.gitignore** - Added ignore entry with explanatory comment +- **Git history** - One commit documenting the change + +## Related Files + +- **dotfiles/my-aliases.zsh.original** - Template file (remains tracked) +- **setup/setup.sh** - Script that generates aliases from template +- **~/.oh-my-zsh/custom/aliases.zsh** - Final generated aliases location