#!/bin/bash # ============================================================================== # Script Description: # This script connects an existing local directory to a remote Git repository. # # Process: # 1. Initializes a new local Git repository. # 2. Adds the remote 'origin'. # 3. Fetches the remote repository data. # 4. Stages local files to check differences. # 5. Identifies real changes bypassing the Git --name-only whitespace bug. # 6. Prompts to override local files if diffs are found. # ============================================================================== if [ -z "$1" ]; then echo "Error: No repository SSH URL provided." echo "Usage: $0 " exit 1 fi REPO_URL=$1 BRANCH="master" echo "Initializing Git repository..." git init echo "Adding remote 'origin' -> $REPO_URL" git remote add origin "$REPO_URL" echo "Fetching from origin..." git fetch origin echo "Staging local files so Git can compare them..." git add . echo "Checking for differences (ignoring line-endings and whitespace)..." if git diff --cached --quiet --ignore-cr-at-eol --ignore-space-at-eol "origin/$BRANCH"; then echo "Local folder matches remote origin/$BRANCH exactly." else echo "" echo "Differences exist in the following files:" # We use --numstat instead of --name-only. # Files with only whitespace diffs will output '0 \t 0 \t filename'. # Awk filters out the ones where added ($1) and deleted ($2) are both 0. # Note: Binary changes show as '-' rather than '0', which awk will correctly keep. git diff --cached --numstat --ignore-cr-at-eol --ignore-space-at-eol "origin/$BRANCH" | \ awk -F'\t' '$1!="0" || $2!="0" {print $3}' echo "" read -p "Do you want to discard your local changes and accept the remote version for these files? (y/N): " choice case "$choice" in [yY]* ) echo "Accepting remote versions..." ;; * ) echo "Operation aborted by user." echo "You can review full diffs manually by running: git diff --cached --ignore-cr-at-eol --ignore-space-at-eol origin/$BRANCH" exit 1 ;; esac fi echo "Setting up tracking and aligning with remote..." # 1. First ensure we are on the correct branch name git checkout -B "$BRANCH" # 2. Reset hard FIRST so the branch actually has commits git reset --hard "origin/$BRANCH" # 3. NOW set the upstream tracking, since the branch is no longer empty git branch --set-upstream-to="origin/$BRANCH" "$BRANCH" echo "Success! The local folder is now completely linked to the remote repository."