2025-11-10
针对 Git Clone 功能进行了三个关键优化,提升了日志记录、分支处理和路径跟踪能力。
- 之前仅通过 SSE 事件发送日志,没有持久化记录
- 缺少服务端日志用于调试和问题追踪
在以下文件中集成了 AutoDevLogger:
mpp-server/src/main/kotlin/cc/unitmesh/server/service/GitCloneService.ktmpp-server/src/main/kotlin/cc/unitmesh/server/command/GitCommand.kt
- ✅ 所有关键操作都记录到日志文件
~/.autodev/logs/autodev-app.log - ✅ 使用不同日志级别(INFO、DEBUG、WARN、ERROR)
- ✅ 记录详细的命令执行信息和结果
- ✅ 包含异常堆栈跟踪便于调试
logger.info { "Starting clone process for projectId: $projectId, gitUrl: $gitUrl, branch: ${branch ?: "default"}" }
logger.info { "Created workspace directory at: $projectPath" }
logger.info { "✓ Clone completed successfully at: $projectPath" }- 之前硬编码使用
main作为默认分支(第146行) - 如果仓库的默认分支不是
main(如master、develop等),会导致失败 - 用户传错分支名时没有自动回退机制
// 之前:硬编码分支
cmd.addAll(listOf("-b", branch ?: "main"))
// 现在:让 Git 使用远程仓库的默认分支
if (!branch.isNullOrBlank()) {
logger.info { "Cloning with specified branch: $branch" }
cmd.addAll(listOf("-b", branch))
} else {
logger.info { "No branch specified, Git will use repository's default branch" }
}// 如果指定的分支失败,自动尝试使用默认分支
if (!success && !branch.isNullOrBlank()) {
logger.warn { "Clone with branch '$branch' failed, retrying with default branch" }
emitLog(AgentEvent.CloneLog("Branch '$branch' not found, trying repository's default branch..."))
// 清理目录并重试,不指定分支
deleteDirectory(workspaceDir.toPath())
workspaceDir.mkdirs()
val fallbackCmd = mutableListOf("git", "clone", "--depth", "1", gitUrl, ".")
return executeGitCommand(fallbackCmd, workspaceDir, emitLog)
}// 之前:默认 pull main
if (!branch.isNullOrBlank()) {
cmd.add(branch)
} else {
cmd.add("main") // ❌ 硬编码
}
// 现在:使用当前跟踪分支
if (!branch.isNullOrBlank()) {
logger.info { "Pulling specified branch: $branch" }
cmd.add(branch)
} else {
logger.info { "No branch specified for pull, Git will pull current/tracking branch" }
// 不指定分支,让 git pull 使用当前跟踪分支
}- ✅ 支持任何默认分支(main、master、develop等)
- ✅ 用户体验更好:错误分支名会自动重试
- ✅ 符合 Git 标准行为
lastClonedPath是实例变量,服务重启后丢失- 没有方法查询已克隆项目的路径
- 无法追踪多个项目的工作区
// 新增:Map 跟踪所有项目
private val tempDirectoryMap = mutableMapOf<String, String>()private fun createWorkspaceDir(projectId: String): Path {
val tempDir = Files.createTempDirectory("autodev-clone-")
logger.info { "Created temporary directory: ${tempDir.pathString}" }
val workspaceDir = tempDir.resolve(projectId)
Files.createDirectories(workspaceDir)
logger.info { "Created workspace directory: ${workspaceDir.pathString} for projectId: $projectId" }
// 存储映射关系
tempDirectoryMap[projectId] = workspaceDir.pathString
return workspaceDir
}/**
* 获取指定项目的工作区路径
*/
fun getWorkspacePath(projectId: String): String? {
return tempDirectoryMap[projectId] ?: lastClonedPath
}
/**
* 获取所有已跟踪的工作区
*/
fun getAllWorkspaces(): Map<String, String> {
logger.info { "Retrieved all workspaces: ${tempDirectoryMap.size} entries" }
return tempDirectoryMap.toMap()
}- ✅ 可以跟踪多个项目的工作区
- ✅ 提供查询 API 供其他服务使用
- ✅ 所有路径变更都记录到日志中
mpp-server 无法找到 KLogger 类
在 mpp-server/build.gradle.kts 中添加显式依赖:
dependencies {
// Use JVM target from multiplatform project
implementation(projects.mppCore)
// Add kotlin-logging explicitly for JVM
implementation("io.github.oshai:kotlin-logging-jvm:7.0.13")
implementation("ch.qos.logback:logback-classic:1.5.16")
// ... 其他依赖
}./gradlew :mpp-server:clean :mpp-server:build结果: ✅ BUILD SUCCESSFUL
# 实时查看日志
tail -f ~/.autodev/logs/autodev-app.log
# 搜索 Git 相关日志
grep "GitCloneService\|GitCommand" ~/.autodev/logs/autodev-app.log[GitCloneService] Starting clone process for projectId: my-project, gitUrl: https://github.com/user/repo.git, branch: default
[GitCloneService] Created temporary directory: /tmp/autodev-clone-12345
[GitCloneService] Created workspace directory: /tmp/autodev-clone-12345/my-project for projectId: my-project
[GitCloneService] No branch specified, Git will use repository's default branch
[GitCloneService] Executing git command: git clone --depth 1 https://github.com/user/repo.git . in directory: /tmp/autodev-clone-12345/my-project
[GitCloneService] ✓ Git command completed successfully: git clone --depth 1 https://github.com/user/repo.git .
[GitCloneService] ✓ Clone completed successfully at: /tmp/autodev-clone-12345/my-project
[GitCloneService] Stored lastClonedPath: /tmp/autodev-clone-12345/my-project for projectId: my-project
-
mpp-server/src/main/kotlin/cc/unitmesh/server/service/GitCloneService.kt- 添加 AutoDevLogger
- 优化分支处理逻辑
- 添加临时目录跟踪
- 添加查询 API
-
mpp-server/src/main/kotlin/cc/unitmesh/server/command/GitCommand.kt- 添加 AutoDevLogger
- 记录所有 Git 操作
-
mpp-server/build.gradle.kts- 添加 kotlin-logging-jvm 依赖
- 添加 logback-classic 依赖
- 持久化存储: 考虑将
tempDirectoryMap持久化到数据库或文件中,以支持服务重启后恢复 - 清理机制: 添加定时任务清理旧的临时目录
- 日志轮转: 配置 logback.xml 进行日志文件轮转,避免文件过大
- 监控: 添加 Prometheus metrics 来跟踪 clone 成功率和耗时