You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

GitLab CI中git log指定目录返回错误提交的解决方法

解决GitLab CI脚本获取特定目录最后提交的问题

问题根源

你的脚本里git log -1 --format="%at" -- example_directory在部分机器失效,主要有两个核心原因:

  • 若目标目录不存在(比如CI浅克隆导致目录变更历史未被拉取,或目录已被删除),Git会直接忽略路径参数,返回仓库全局的最新提交。
  • 浅克隆环境下仓库历史不完整,无法定位到该目录的最新修改提交,只能返回当前克隆范围内的最后提交。

修复方案

1. 先校验目标目录存在性

在执行Git命令前,先检查目录是否存在,避免Git忽略路径参数:

if [ ! -d "example_directory" ]; then
    echo "目标目录example_directory不存在" >&2
    exit 20
fi

2. 使用更精准的Git命令获取目录最后提交

替换原有的LAST_COMMIT获取逻辑,用git rev-list严格筛选修改该目录的最后提交,再转换为时间戳:

# 获取最后一个修改example_directory的提交ID
LAST_COMMIT_ID=$(git rev-list -1 HEAD -- example_directory)
# 若未找到任何修改该目录的提交,直接抛出错误
if [ -z "$LAST_COMMIT_ID" ]; then
    echo "未找到修改example_directory的提交记录" >&2
    exit 20
fi
# 将提交ID转换为时间戳
LAST_COMMIT=$(git show -s --format="%at" "$LAST_COMMIT_ID")

git rev-list -1 HEAD -- example_directory会精准返回最后一个修改指定路径的提交,不会因为目录不存在或历史不全返回全局提交。

3. 调整CI克隆深度(针对浅克隆场景)

GitLab CI默认可能使用浅克隆(如GIT_DEPTH: 50),导致拉取的历史不足以覆盖该目录的提交记录。在CI配置中设置拉取完整历史:

variables:
  GIT_DEPTH: 0  # 拉取完整仓库历史

也可根据实际情况设置足够大的深度,确保覆盖该目录的所有提交历史。

完整修复后的脚本

ERROR_THRESHOLD="2 weeks ago"
WARNING_THRESHOLD="1 week ago"

# 检查目标目录是否存在
if [ ! -d "example_directory" ]; then
    echo "目标目录example_directory不存在" >&2
    exit 20
fi

TWO_WEEKS_AGO=$(date -d "${ERROR_THRESHOLD}" +%s)
ONE_WEEK_AGO=$(date -d "${WARNING_THRESHOLD}" +%s)

# 获取最后一个修改目标目录的提交时间戳
LAST_COMMIT_ID=$(git rev-list -1 HEAD -- example_directory)
if [ -z "$LAST_COMMIT_ID" ]; then
    echo "未找到修改example_directory的提交记录" >&2
    exit 20
fi
LAST_COMMIT=$(git show -s --format="%at" "$LAST_COMMIT_ID")

# 错误阈值检查
if ! (( $LAST_COMMIT > $TWO_WEEKS_AGO )); then 
    echo "Last commit was more than two weeks ago" >&2 
    exit 20; 
fi

# 警告阈值检查
if ! (( $LAST_COMMIT > $ONE_WEEK_AGO )); then 
    echo "Last commit was more than one week ago" >&2 
    exit 10; 
fi

内容的提问来源于stack exchange,提问作者yakatz

火山引擎 最新活动