MST

星途 面试题库

面试题:Bash脚本与Git版本控制深度集成及优化

设计一个复杂的Bash脚本,实现如下功能:监控一个指定目录及其子目录下文件的变化。一旦有文件发生变化,自动将变化的文件添加到Git暂存区,判断当前是否处于一个有效的Git仓库中,如果是则进行提交,提交信息包含变化的文件名和当前时间。同时,脚本需要具备一定的性能优化,例如在文件变化频繁时避免重复提交,采用合适的机制进行批量提交等。
41.7万 热度难度
编程语言Bash

知识考点

AI 面试

面试题答案

一键面试
#!/bin/bash

# 设定监控的目录
WATCH_DIR="$1"
if [ -z "$WATCH_DIR" ]; then
    echo "Usage: $0 <directory_to_watch>"
    exit 1
fi

# 用于存储已变化文件的数组
CHANGED_FILES=()

# 检查当前目录是否是有效的Git仓库
is_git_repo() {
    git rev-parse --is-inside-work-tree &> /dev/null
    return $?
}

# 处理文件变化
handle_change() {
    FILE="$1"
    # 检查文件是否在指定目录及其子目录内
    if [[ "$FILE" == "$WATCH_DIR"/** ]]; then
        CHANGED_FILES+=("$FILE")
        # 这里可以设置一个定时器或者事件队列机制,避免频繁提交
        # 简单示例:每10秒检查一次并提交
        if [ ${#CHANGED_FILES[@]} -gt 0 ]; then
            sleep 10
            if is_git_repo; then
                git add "${CHANGED_FILES[@]}"
                TIMESTAMP=$(date +%Y-%m-%d_%H:%M:%S)
                COMMIT_MSG="Files changed: ${CHANGED_FILES[*]} at $TIMESTAMP"
                git commit -m "$COMMIT_MSG"
                CHANGED_FILES=()
            else
                echo "Not in a valid Git repository. Skipping commit."
            fi
        fi
    fi
}

# 使用inotifywait监控文件变化
inotifywait -mrq --format '%w%f' -e create,delete,modify,move $WATCH_DIR | while read FILE; do
    handle_change "$FILE"
done
  1. 脚本说明

    • 首先,脚本接收一个参数作为要监控的目录WATCH_DIR,如果没有提供参数则提示用法并退出。
    • is_git_repo函数用于判断当前目录是否是一个有效的Git仓库。
    • handle_change函数处理文件变化,将变化的文件添加到CHANGED_FILES数组中,并在一定时间间隔(这里是10秒)后检查是否在有效的Git仓库中,如果是则进行批量提交。
    • 使用inotifywait命令来监控指定目录及其子目录下文件的创建、删除、修改和移动事件,并通过while read循环处理每个变化事件。
  2. 性能优化

    • 通过使用数组CHANGED_FILES存储变化的文件,实现批量操作。
    • 设置sleep 10,在10秒内收集所有变化的文件,避免文件变化频繁时的重复提交。实际应用中,可以根据需求调整这个时间间隔或者采用更复杂的事件队列机制。