--- tags: - Bash - Scripting - Linux --- # Git Repo Updater (Script) ## Purpose Standalone `repo_watcher.sh` script used by the Git Repo Updater container. This script clones or pulls one or more repositories and rsyncs them into destination paths. For the containerized version and deployment details, see the [Git Repo Updater container doc](../../platforms/containerization/docker/custom-containers/git-repo-updater.md). ## Script ```sh #!/bin/sh # Function to process each repo-destination pair process_repo() { FULL_REPO_URL=$1 DESTINATION=$2 # Extract the URL without credentials for logging and notifications CLEAN_REPO_URL=$(echo "$FULL_REPO_URL" | sed 's/https:\/\/[^@]*@/https:\/\//') # Directory to hold the repository locally REPO_DIR="/root/Repo_Cache/$(basename $CLEAN_REPO_URL .git)" # Clone the repo if it doesn't exist, or navigate to it if it does if [ ! -d "$REPO_DIR" ]; then curl -d "Cloning: $CLEAN_REPO_URL" $NTFY_URL git clone "$FULL_REPO_URL" "$REPO_DIR" > /dev/null 2>&1 fi cd "$REPO_DIR" || exit # Fetch the latest changes git fetch origin main > /dev/null 2>&1 # Check if the local repository is behind the remote LOCAL=$(git rev-parse @) REMOTE=$(git rev-parse @{u}) if [ "$LOCAL" != "$REMOTE" ]; then curl -d "Updating: $CLEAN_REPO_URL" $NTFY_URL git pull origin main > /dev/null 2>&1 rsync -av --delete --exclude '.git/' ./ "$DESTINATION" > /dev/null 2>&1 fi } # Main loop while true; do # Iterate over each environment variable matching 'REPO_[0-9]+' env | grep '^REPO_[0-9]\+=' | while IFS='=' read -r name value; do # Split the value by comma and read into separate variables OLD_IFS="$IFS" # Save the original IFS IFS=',' # Set IFS to comma for splitting set -- $value # Set positional parameters ($1, $2, ...) REPO_URL="$1" # Assign first parameter to REPO_URL DESTINATION="$2" # Assign second parameter to DESTINATION IFS="$OLD_IFS" # Restore original IFS process_repo "$REPO_URL" "$DESTINATION" done # Wait for 5 seconds before the next iteration sleep 5 done ```