I have php website for prevent hacker modify any file and inject backdoor.
I want to use git as a file tracking solution.  This is my shell script:
#!/bin/sh
msg_i(){
    echo "[I] $1"
}
msg_e(){
    echo "[E] $1"
}
if ! git rev-parse --is-inside-work-tree > /dev/null 2>&1; then
    msg_e "Not in a git repository."
    exit 1
fi
GIT_DIR=$(git rev-parse --git-dir)
export GIT_DIR="$GIT_DIR"
BRANCH_NAME=main
AUTOBACKUP_BRANCH_NAME=main-autobackup
if ! git show-ref --quiet "refs/heads/${AUTOBACKUP_BRANCH_NAME}"; then
    if git branch "${AUTOBACKUP_BRANCH_NAME}"; then
        msg_i "Created new branch ${AUTOBACKUP_BRANCH_NAME}."
    else
        msg_e "Failed to create branch ${AUTOBACKUP_BRANCH_NAME}."
    fi
fi
git add . 
AUTOBACKUP_TREE=$(git write-tree)
AUTOBACKUP_PARENT_COMMIT=$(git show-ref --hash --heads $AUTOBACKUP_BRANCH_NAME)
AUTOBACKUP_DIFF_INDEX=$(git diff-index "${AUTOBACKUP_PARENT_COMMIT}" --name-status)
if [ -z "$AUTOBACKUP_DIFF_INDEX" ]; then
    msg_i "No changes detected in branch $AUTOBACKUP_BRANCH_NAME."
else
    DIFF_INFORMATION=$(echo "$AUTOBACKUP_DIFF_INDEX" | awk '{status=$1; file=substr($0, index($0,$2)); if (status == "A") desc="added"; else if (status == "C") desc="copied"; else if (status == "D") desc="deleted"; else if (status == "M") desc="modified"; else if (status == "R") desc="renamed"; else if (status == "T") desc="type changed"; else if (status == "U") desc="unmerged"; else if (status == "X") desc="unknown"; else if (status == "B") desc="pairing broken"; else desc=status; printf "%s %s\n", desc, file}')
    AUTOBACKUP_COMMIT_MESSAGE=$(echo "$DIFF_INFORMATION" | awk '{print $1}' | sort | uniq -c | awk '{print $2 ": " $1}' | paste -sd " " -)
    AUTOBACKUP_COMMIT_HASH=$(git commit-tree "${AUTOBACKUP_TREE}" -p "${AUTOBACKUP_PARENT_COMMIT}" -m "${AUTOBACKUP_COMMIT_MESSAGE}" -m "${DIFF_INFORMATION}")
    echo "${AUTOBACKUP_COMMIT_HASH}" | xargs git branch -f $AUTOBACKUP_BRANCH_NAME
    DIFF_OUTPUT=$(git diff-tree --no-commit-id --name-status -r "$(git show-ref --hash --heads $AUTOBACKUP_BRANCH_NAME)~1" "$(git show-ref --hash --heads $AUTOBACKUP_BRANCH_NAME)" --)
    if [ -z "$DIFF_OUTPUT" ]; then
        msg_i "Last commit in $AUTOBACKUP_BRANCH_NAME is empty, deleting last commit."
        git update-ref refs/heads/$AUTOBACKUP_BRANCH_NAME "${AUTOBACKUP_COMMIT_HASH}~1"
    else
        msg_i "Changes detected in branch $AUTOBACKUP_BRANCH_NAME."
    fi
fi
if [ "$(git rev-list --count "${AUTOBACKUP_BRANCH_NAME}..${BRANCH_NAME}")" -gt 0 ]; then
    msg_i "Merging ${BRANCH_NAME} into ${AUTOBACKUP_BRANCH_NAME}."
    MERGE_BASE=$(git merge-base "${BRANCH_NAME}" "${AUTOBACKUP_BRANCH_NAME}")
    git merge-tree "${MERGE_BASE}" "${BRANCH_NAME}" "${AUTOBACKUP_BRANCH_NAME}"
    MERGE_COMMIT=$(git commit-tree "${AUTOBACKUP_TREE}" -p "${AUTOBACKUP_BRANCH_NAME}" -p "${BRANCH_NAME}" -m "update branch" -m "Silently merged ${BRANCH_NAME} into ${AUTOBACKUP_BRANCH_NAME}.");
    echo "${MERGE_COMMIT}" | xargs git branch -f $AUTOBACKUP_BRANCH_NAME
fi
git push origin $AUTOBACKUP_BRANCH_NAME
This script idea based on this https://stackoverflow.com/a/25520876/12716228 and add some modification.
This script result is:
Did I miss something before I run this on server with systemd timers or cron?
