# CodeManager **Repository Path**: zttheal/code-manager ## Basic Information - **Project Name**: CodeManager - **Description**: No description available - **Primary Language**: Unknown - **License**: MulanPSL-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-02-28 - **Last Updated**: 2026-03-01 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 文件同步工具 用于内外网隔离环境下的增量文件同步工具。只传输变更文件的信息,不直接传输文件内容。 ## 核心特性 - **增量同步**:只检测和记录变更的文件 - **小体积清单**:生成的清单文件非常小,适合通过受限通道传输 - **多种哈希算法**:支持 MD5 完整哈希和快速模式(大小+时间) - **灵活配置**:支持忽略规则、压缩等 - **传输无关**:不依赖具体的传输方式,只生成变更清单 - **独立工具**:内网扫描和外网应用使用独立的 JAR 文件 ## 编译 ```bash mvn clean package -DskipTests ``` 编译后会生成三个独立的可执行 JAR 文件: - `file-sync-tool-scanner.jar` - 内网扫描工具 - `file-sync-tool-applier.jar` - 外网应用工具 - `file-sync-tool-viewer.jar` - 清单查看工具 ## 工作流程 ``` ┌─────────────┐ ┌─────────────┐ │ 内网环境 │ │ 外网环境 │ │ │ │ │ │ 项目源码 │ ──1. scan──> 清单 │ │ │ │ │ │ │ hash.index │ <──── 保存 ──── │ │ │ │ │ │ └─────────────┘ └─────────────┘ │ ▲ │ 2. 传输清单(小文件) │ └──────────────────────────────────┘ │ 3. apply │ 同步文件 ``` ## 使用方式 ### 1. 内网端 - 扫描生成清单 使用 `file-sync-tool-scanner.jar`: ```bash java -jar file-sync-tool-scanner.jar [hashIndexPath] ``` 参数说明: - `sourcePath`: 要同步的源目录 - `manifestOutput`: 输出的清单文件路径 - `hashIndexPath`: 哈希索引存储路径(可选,默认: hash.index) 示例: ```bash java -jar file-sync-tool-scanner.jar /home/user/project manifest.json hash.index ``` 输出示例: ``` ======================================== 内网文件同步扫描工具 ======================================== 开始扫描目录: /home/user/project 扫描完成,共发现 150 个文件/目录 加载历史索引,共 148 条记录 变更检测完成: 新增: 2 修改: 3 删除: 0 清单已保存到: manifest.json 哈希索引已保存到: hash.index ======================================== 扫描完成! ======================================== 清单文件: manifest.json 哈希索引: hash.index 请将清单文件传输到外网环境进行同步 ``` ### 2. 传输清单文件 将生成的 `manifest.json` 通过你的传输工具传到外网。 清单文件很小,只包含变更文件的路径和哈希信息,示例内容: ```json { "version" : "1.0", "createdAt" : 1700000000000, "sourcePath" : "/home/user/project", "addedFiles" : [ { "relativePath" : "src/main/java/NewFile.java", "hash" : "a1b2c3d4...", "size" : 1024, "type" : "FILE" } ], "modifiedFiles" : [ ... ], "deletedFiles" : [ ] } ``` ### 3. 外网端 - 查看清单内容(可选) 使用 `file-sync-tool-viewer.jar`: ```bash java -jar file-sync-tool-viewer.jar ``` 示例: ```bash java -jar file-sync-tool-viewer.jar manifest.json ``` 输出示例: ``` ======================================== 清单查看工具 ======================================== 清单信息: 版本: 1.0 创建时间: Sat Feb 28 22:27:16 CST 2026 源路径: test-project 新增文件 (1): + new-file.txt (hash: 6fca962bab3697303a4dd256c3a69097) 修改文件 (0): 删除文件 (0): 未变更文件 (3): = file1.txt = file2.txt = file3.txt ======================================== 共 1 个变更需要同步 ======================================== ``` ### 4. 外网端 - 应用清单 使用 `file-sync-tool-applier.jar`: ```bash java -jar file-sync-tool-applier.jar [sourceBasePath] ``` 参数说明: - `manifestPath`: 清单文件路径 - `targetPath`: 目标目录(外网项目位置) - `sourceBasePath`: 源文件基础路径(可选,用于回调传输) 示例: ```bash java -jar file-sync-tool-applier.jar manifest.json /home/user/project ``` 输出示例: ``` ======================================== 外网文件同步应用工具 ======================================== 开始应用同步清单: manifest.json 清单加载完成: SyncManifest{version='1.0', createdAt=1772288836996, added=1, modified=0, deleted=0} [传输] test-project\new-file.txt -> target-project\new-file.txt 同步结果: 新增: 1 个 修改: 0 个 删除: 0 个 错误: 0 个 ======================================== 同步完成! ======================================== 同步成功! ``` ## API 使用方式 除了命令行,你也可以在代码中使用: ### 内网端 - 生成清单 ```java SyncConfig config = new SyncConfig(); config.setSourcePath("/path/to/project"); config.setManifestPath("manifest.json"); config.setHashIndexPath("hash.index"); FileSyncTool tool = new FileSyncTool(config); SyncManifest manifest = tool.scan(); if (manifest.hasChanges()) { System.out.println("发现 " + manifest.countChanges() + " 个变更"); } ``` ### 外网端 - 应用清单 ```java SyncConfig config = new SyncConfig(); config.setTargetPath("/path/to/target"); FileSyncTool tool = new FileSyncTool(config); // 使用回调函数处理文件传输 SyncResult result = tool.apply("manifest.json", (sourcePath, targetPath) -> { // 在这里调用你的传输工具 // 例如:调用 SCP、FTP、专用传输工具等 transferFile(sourcePath, targetPath); }); System.out.println(result); ``` ## 配置选项 ```java SyncConfig config = new SyncConfig(); // 启用快速模式(不计算完整MD5,只比较大小和时间) config.setUseQuickMode(true); // 启用清单压缩 config.setCompressManifest(true); // 添加忽略规则 config.addIgnorePattern("*.log"); config.addIgnorePattern(".git/**"); config.addIgnorePattern("node_modules/**"); ``` ## 项目结构 ``` src/main/java/com/sync/ ├── FileSyncTool.java # 核心工具类 ├── cli/ │ ├── InternalScanner.java # 内网扫描工具(独立入口) │ ├── ExternalApplier.java # 外网应用工具(独立入口) │ └── ManifestViewer.java # 清单查看工具(独立入口) ├── model/ │ ├── FileInfo.java # 文件信息模型 │ ├── FileType.java # 文件类型枚举 │ └── SyncManifest.java # 同步清单 ├── scanner/ │ ├── FileScanner.java # 文件扫描器 │ └── ChangeDetector.java # 变更检测器 ├── storage/ │ ├── ManifestStorage.java # 清单存储 │ └── HashIndexStorage.java # 哈希索引存储 ├── sync/ │ ├── SyncApplier.java # 同步应用器 │ └── SyncResult.java # 同步结果 └── util/ └── HashUtil.java # 哈希工具 ``` ## 注意事项 1. **首次同步**:首次执行时没有历史索引,会扫描所有文件作为新增 2. **哈希索引**:`hash.index` 文件用于记录上次同步的状态,需要妥善保存 3. **文件传输**:本工具只生成变更清单,实际文件传输需要你自己实现或使用现有工具 4. **权限**:确保程序有足够的权限读取源目录和写入目标目录 5. **独立部署**:内网和外网分别部署对应的 JAR 文件,不需要同时部署所有工具