news 2026/11/6 5:31:30

Git 大仓库下载优化:浅克隆、部分克隆与离线快照实践

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Git 大仓库下载优化:浅克隆、部分克隆与离线快照实践

简介:围绕 repository 概念与代码仓库下载整理的一份实战型资料包,面向 Java 开发、构建工具学习及需要离线依赖复现的开发者,帮助理解远程仓库、本地缓存与项目依赖之间的对应关系,并可用于构建排错和仓库结构梳理。压缩包共约2000个文件、324.34MB,以 sha1 校验文件、repositories 元数据、pom 依赖描述和 jar 构件为主体,辅以少量 xml 配置、properties、war 包及 lastupdated、lock 等状态文件,较完整地呈现了一个依赖仓库的目录层级与缓存痕迹。已有916人学习下载。读者可从中观察 Maven 风格仓库的组织方式,借助 pom 与 jar 的配套关系核对依赖版本,结合校验文件和元数据排查下载不完整、依赖缺失等问题,也可作为离线环境搭建与仓库清理的参考样本。

1. 从一次 clone 卡在 87% 说起:repository 下载到底在拉什么

上周帮同事看一个自动化脚本,报错停在一行git clone后面,进度条卡在 87% 十几分钟没动。他以为是自己网络不行,反复重试了七次,每次都在同一个百分比附近断掉。这类问题的原因通常不是带宽不够。repository 下载卡住,八成是传输策略没选对:一个持续提交了十年的仓库,你要的可能只是最新那一版代码,却默认把全部历史、全部分支、全部大文件都拖了下来。

这份资料把 repository 下载拆成三条可复现的路径:第一条是代码仓库本身怎么拉,覆盖浅克隆、部分克隆、稀疏检出、大文件存储和子模块;第二条是依赖仓库和制品仓库怎么拉,覆盖包管理器源配置、依赖预下载、离线搬运;第三条是拉下来之后怎么校验、怎么留一份能回滚的快照。它面向的是需要频繁拉第三方代码的开发者、要做离线部署的运维,以及在 CI 里被 clone 阶段拖慢整条流水线的工程师。整套东西是命令行模板加校验脚本,不依赖某个特定平台,复制走就能改。

2. 先把对象模型摸清:git clone 到底在拉哪些对象

2.1 四层结构:ref、commit、tree、blob

不搞清楚 clone 在传什么,所有优化都是瞎猜。Git 的存储是内容寻址的四层结构:blob 存单个文件的内容,tree 存一层目录结构和文件名到 blob 的映射,commit 指向一个根 tree 加上父 commit,ref 则是指向某个 commit 的命名指针,分支、tag 都是 ref。一次默认的git clone,协商阶段先把服务端所有 ref 列出来,然后按可达性遍历,把 ref 指向的 commit、commit 链上的全部历史 commit、每个 commit 对应的 tree,以及 tree 里引用的全部 blob 打成 packfile 传过来。

下载量的大头几乎永远在 blob 上。一个仓库如果中途提交过设计稿、数据集、编译产物,哪怕后来删掉了,那些 blob 依然躺在历史里,照样会被拉下来。我见过一个仓库,最新代码不到 20MB,完整 clone 下来 1.8G,多出来的全是三年前误提交后又删除的二进制文件——删除只是在新 commit 的 tree 里不再引用它,历史里的对象一个没少。

对象类型存什么典型体积占比能否按需拉取
ref分支、tag 指针极小可筛选(--single-branch、--no-tags)
commit提交元信息 + 父指针小可截断(--depth)
tree目录结构与文件名中可延迟(--filter=tree:0)
blob文件内容大可延迟(--filter=blob:none)

这张表是后面所有参数的底层依据。你每加一个参数,本质都是在告诉服务端“这层对象我先不要”。

2.2--depth、--filter、--sparse各自管什么

三个参数经常被混着用,实际职责完全不同。

--depth=N截断的是 commit 历史的深度,只保留最近 N 个 commit 及其对应的 tree、blob。它减少的是“历史版本”,最新一版的完整内容一个不少。副作用是git log看不到 N 层之前的东西,git blame会断层,git describe找不到早期 tag。

--filter=blob:none不做历史截断,commit 和 tree 全都拿,但 blob 一个不拿,等你真正checkout、diff、cat某个文件时再按需向服务端要。这种模式叫 partial clone,服务端会被登记成 promisor remote。它的好处是历史完整、git log正常,代价是后续每次访问冷文件都有一次网络往返。

--sparse只影响工作区检出范围,它不减少对象下载量。这是个高频误解:很多人以为加了--sparse就是“只下我需要的目录”,实际上如果不配--filter,clone 阶段照样全量拉完,只是最后不往磁盘上铺开。单独用--sparse省的是磁盘,不是流量。

2.3 三套命令模板:读码、CI 构建、离线归档

按使用场景分,我一般就用这三套,改改路径就能跑。

# 模板一:只想看最新代码,不关心历史(读源码、临时验证、跑个 demo) git clone \ --depth 1 \ # 只要最新一个 commit,历史全部丢弃 --single-branch \ # 只拉默认分支,其它分支的 ref 不要 --no-tags \ # 不拉 tag 对象,省一轮协商 https://example.com/group/project.git \ ./project

这套适合“下载完看一眼就删”的场景,1.8G 的仓库用它能压到 40MB 以内。参数含义很直白:--depth 1隐含了--single-branch,但显式写出来更清楚;--no-tags在只读代码时没有副作用,反倒能省掉一次 tag 列表协商。要注意的是它拿不到版本号,如果项目用 tag 生成版本,构建出来的产物版本会是0.0.0,这个坑后面单独说。

# 模板二:CI 里按需拉取,只要构建目录 git clone --filter=blob:none --no-checkout https://example.com/group/project.git cd project git sparse-checkout init --cone # cone 模式,按目录而不是通配符 git sparse-checkout set src build # 只检出这两个目录 git checkout main # 触发检出,此时才真正拉 blob du -sh .git # 验证 partial clone 是否生效

--no-checkout让 clone 完不铺工作区,先配好稀疏规则再 checkout,避免先拉一遍全量 blob 再删掉。--cone是稀疏检出的推荐模式,它只支持目录级规则,语义简单、匹配快、不容易写错。最后那句du -sh .git是必须的验证动作——有些服务端不支持 filter 能力,会静默降级成全量克隆,你以为用了 partial clone,其实一点没省。

# 模板三:离线归档,要完整历史、所有分支、所有 tag git clone --mirror https://example.com/group/project.git project.git cd project.git git bundle create ../project.bundle --all # 打成单文件,方便搬到无网环境 git bundle verify ../project.bundle # 迁移前先验一遍完整性

--mirror是裸克隆加全 ref 映射,配置也一起带走,适合做备份或往内网搬。git bundle把整个仓库压成一个文件,目标机器上git clone project.bundle就能还原,不需要任何网络。--all表示包含所有 ref,漏了它只会打当前分支,搬过去发现分支没了。

3. 大仓库怎么拉得动:浅克隆、部分克隆与稀疏检出的组合拳

3.1 浅克隆的深度怎么定,--shallow-since有什么坑

--depth的取值不是越大越好。构建、跑测试、看最近改动,--depth 1足够;需要git log回溯排障,--depth 50能覆盖绝大多数情况;需要git describe拿到最近 tag,深度得足够跨到那个 tag,通常 100 到 200 更稳。经验值是先--depth 1跑通,不够再用--deepen增量加深,别一上来就猜一个三位数。

# 先浅拉,再按需加深,避免一次性猜错深度 git clone --depth 1 --single-branch --branch main https://example.com/group/project.git cd project git fetch --deepen=200 # 在当前基础上再往前要 200 个 commit git fetch --unshallow # 彻底补全,变回完整仓库(大仓库慎用) git fetch --tags --depth=1 # 单独补 tag,配合浅历史使用

--deepen是增量操作,只补差量,代价可控;--unshallow是一次性把缺失历史全要回来,在几百 MB 的仓库上等于重下一次,非必要不用。git fetch --tags --depth=1是个折中:历史仍然浅,但 tag 列表补上了,git describe至少能拿到 tag 名,版本号不会再退化成0.0.0。

--shallow-since="2024-01-01"看起来更符合直觉——按时间而不是按条数截断。但它依赖提交时间戳,而这东西并不可靠:rebase、cherry-pick、跨时区协作都会改写时间戳,历史上出现过“新提交带着旧时间”的情况,结果就是拉下来的历史比预期短,甚至只拿到一个 commit。我的做法是只在明确知道仓库提交节奏规律时才用它,其余场景一律用--depth配合--deepen。

3.2 partial clone:blob:none和tree:0怎么选

--filter=blob:none是最实用的档位。commit 和 tree 齐了,git log --oneline、git ls-tree、git diff --stat这类操作都不需要联网,只有真正读文件内容才触发拉取。对于“我要翻代码找一段逻辑”的场景,这个档位几乎无感。

--filter=tree:0更激进,连 tree 都不拿。clone 结束时.git目录可能只有几 MB,但代价是git status都会触发成百上千次按需请求,因为 status 需要比对工作区和 HEAD 的 tree。这个档位我只在一种情况下用:容器镜像构建,明确知道只需要某几个文件,且后续不会有任何交互式操作。

# 激进档位:连 tree 都不要,配合稀疏检出使用 git clone --filter=tree:0 --no-checkout https://example.com/group/project.git cd project git sparse-checkout init --cone git sparse-checkout set deploy git checkout main # 只拉 deploy 目录涉及的 tree 和 blob # 验证服务端是否真的支持 filter(不支持会静默降级) git config --get remote.origin.promisor # 期望输出 true git config --get remote.origin.partialclonefilter # 期望输出 tree:0 或 blob:none

这两条git config --get是排查“为什么没省流量”的第一现场。如果promisor是空的,说明服务端在协商阶段就没接受 filter 参数,多半是协议版本低或者服务端关了这个能力,此时再调参数也没用,只能退回到浅克隆那条路。

还有一个容易被忽略的点:partial clone 之后,git gc、git repack这类本地整理命令可能触发大量按需拉取,因为它们在遍历对象。CI 环境里如果缓存了.git目录又执行 gc,会出现“缓存越大反而越慢”的反常现象。我的习惯是给这类仓库加一条git config gc.auto 0,需要整理时手动来。

3.3 sparse-checkout 的 cone 与非 cone 模式

cone 模式只认目录,规则就是你set进去的那些路径,加上根目录的顶层文件。它不支持通配符,但也因此不会有意外匹配。非 cone 模式走 gitignore 风格的正则,能写*.md这种,代价是匹配规则复杂、大仓库上git status会明显变慢。

# cone 模式:按目录,推荐 git sparse-checkout set --cone src/app src/lib docs # 非 cone 模式:需要通配符时才用,注意 ! 排除规则 git sparse-checkout set --no-cone '/src/**' '/docs/**' '!/src/legacy/**' # 查看当前规则,以及临时关闭稀疏(比如要跑全量测试) git sparse-checkout list git sparse-checkout disable

--no-cone的排除规则写法很容易翻车:!开头是排除,但顺序敏感,后面能覆盖前面,写反了就会出现“我要的文件没检出、不要的全在”。线上排查时我见过有人把!/tests/**写在/tests/**前面,结果等于没排除。团队里统一用 cone,只有在确实要按文件类型筛选时才放开。

3.4 LFS 与 submodule:两个“下载中的下载”

大文件存储和子模块是嵌套下载,坑也最集中。LFS 的机制是:仓库里存的是一个几百字节的指针文件,真实内容在另一套存储上。如果机器上没装 LFS 客户端,或者 clone 时跳过了 smudge 过滤,你拿到的就是一堆文本指针,file一看是 ASCII,打开是version https://...。

# 先跳过大文件,把代码结构拿到手,再按需拉 LFS 内容 GIT_LFS_SKIP_SMUDGE=1 git clone --depth 1 https://example.com/group/project.git cd project git lfs install --local # 只在当前仓库生效,不污染全局 git lfs pull --include="public/assets/**" # 只拉需要的目录 git lfs ls-files # 列出所有 LFS 跟踪文件及状态 # 子模块:递归拉取,且子模块也走浅克隆 git submodule update --init --depth 1 --recursive git submodule status # 检查每个子模块是否到位

GIT_LFS_SKIP_SMUDGE=1是环境变量,必须写在git clone前面,写成参数无效。git lfs pull --include支持通配,能按目录分批拉,比全量git lfs pull省很多时间。子模块那边,--depth 1要写在submodule update上而不是外层 clone 上,否则子模块照样全量。

4. 依赖仓库与制品仓库:把 package 下载从在线改成可控

4.1 源配置与本地缓存:pip 和 npm 的改法

代码拉下来只是第一步,构建时依赖还得从包仓库下载。默认源的问题有两个:一是慢,二是不可复现——今天装的和下个月装的可能不是同一个版本。

# pip:源配置 + 预下载到本地目录 pip config set global.index-url https://pypi.example.com/simple pip config set global.trusted-host pypi.example.com pip download -r requirements.txt \ -d ./wheels \ # 下载目录 --only-binary=:all: \ # 只下 wheel,避免源码包在离线机上还要编译 --platform manylinux2014_x86_64 \ --python-version 311 \ --abi cp311 # 跨平台下载必须指定这三项,否则按当前机器匹配

--only-binary=:all:是关键。混着源码包下载,到了离线机器上还要现编译,而离线机通常没有编译器和头文件。跨平台下载时,--platform、--python-version、--abi三个参数必须同时给,少一个就会报“找不到匹配的发行版”。下载完在目标机器上pip install --no-index --find-links=./wheels -r requirements.txt,全程不碰网络。

# npm:走缓存而不是走网络 npm config set registry https://npm.example.com/ npm config set cache /data/npm-cache --global npm pack <pkg>@1.2.3 -pack-destination ./tarballs # 单个包打成 tgz npm ci --offline --cache /data/npm-cache # 离线安装,缓存缺包会直接失败

npm ci --offline的语义是“只用缓存,绝不联网”,缓存里缺任何一个包都会立刻失败而不是悄悄降级去下载。这个特性在离线环境里非常有用——它帮你提前暴露缺包,而不是等到部署时才发现。缓存目录建议放到数据盘并定期打包,比每次重下划算。

4.2 私有 Maven 仓库的镜像与依赖预下载

Java 生态的仓库配置集中在settings.xml,要点是把所有外部请求收敛到一个可控的镜像上,并且明确允许快照与发布的区分。

<settings> <mirrors> <mirror> <id>internal</id> <mirrorOf>*</mirrorOf> <!-- 拦截所有仓库请求,包括插件仓库 --> <url>https://repo.example.com/repository/maven-public/</url> </mirror> </mirrors> <profiles> <profile> <id>offline-ready</id> <properties> <maven.repo.local>/data/m2</maven.repo.local> <!-- 本地仓库固定路径,便于打包搬运 --> </properties> </profile> </profiles> </settings>

<mirrorOf>*</mirrorOf>会连插件仓库一起接管,这是好事——插件下载失败往往比依赖失败更难查。maven.repo.local指到固定路径,是为了后面能直接把整个目录 tar 走。

# 预下载依赖和插件,注意 go-offline 会漏掉部分动态解析的插件 mvn -s settings.xml dependency:go-offline -Dmaven.repo.local=/data/m2 # 补一次真实构建,把 go-offline 漏掉的插件补齐 mvn -s settings.xml -o clean package -DskipTests -Dmaven.repo.local=/data/m2

dependency:go-offline不是万能的,它会漏掉一些在构建阶段才动态解析的插件和 profile 相关依赖。血泪经验是:跑完 go-offline 之后再跑一次真正的构建,把缺失的补齐,然后再打包整个.m2目录。只靠 go-offline 搬到离线环境,十次有三次会失败。

4.3 完整性校验:sha256、签名、对象检查

下载链路越长,校验越不能省。三层校验按成本从低到高:文件级 sha256、包级签名、仓库级对象完整性。

# 文件级:生成清单并用清单校验 find ./dist -type f -name '*.tar.gz' -exec sha256sum {} \; > SHA256SUMS sha256sum -c SHA256SUMS # Linux shasum -a 256 -c SHA256SUMS # macOS # 仓库级:检查对象是否完整、有无悬空或损坏 git fsck --full --strict # bundle 级:迁移前确认包本身可用 git bundle verify project.bundle

git fsck --full --strict会遍历所有对象,在大仓库上耗时较长,但它是唯一能发现“对象存在但内容损坏”的手段——普通的git status只检查工作区,不会去碰历史对象。我一般在把仓库搬到新环境后跑一次,确认传输过程没出问题。

4.4 离线搬运:bundle 与 wheels 目录怎么组织

离线搬运的核心是“一次打包、可重复还原”。目录结构我固定成三块:代码、依赖、清单。

# 打包 mkdir -p offline/{code,deps} git clone --mirror https://example.com/group/project.git offline/code/project.git cd offline/code/project.git && git bundle create ../project.bundle --all && cd - pip download -r requirements.txt -d offline/deps/wheels --only-binary=:all: tar czf offline/npm-cache.tgz -C /data npm-cache # 生成清单,记录 commit sha 和文件校验和 git -C offline/code/project.git rev-parse HEAD > offline/MANIFEST sha256sum offline/code/project.bundle >> offline/MANIFEST find offline/deps -type f -exec sha256sum {} \; >> offline/MANIFEST # 还原 git clone offline/code/project.bundle restored sha256sum -c offline/MANIFEST

清单里必须记 commit sha,这是唯一能精确定位到某一次代码状态的标识。只记日期或者分支名,下次还原就对不上了。

5. 下载翻车现场排查:现象、根因、处置

5.1 传输中断与认证失败

现象一:RPC failed; curl 56或early EOF,每次都在相近的百分比断掉。根因通常不是带宽,而是历史太深导致单个 packfile 过大,服务端或中间链路有超时限制。处置:先用--depth 1验证能否拉通,能拉通就说明是体积问题;然后分批拉,先--depth 1再--deepen=100逐步加深,每批都可控。调大http.postBuffer是流传最广但效果最有限的做法——它主要影响 push 时的缓冲,对 clone 的流式 packfile 帮助不大,真正的解法还是减小单次传输量。

现象二:主仓库 clone 正常,submodule update报 401 或 403。根因在子模块的 URL 解析:.gitmodules里写的是相对路径,解析时会基于父仓库的协议和主机,但凭证不会自动继承,尤其父仓库用了一种认证方式、子模块站点用另一种。处置:用git config --global url."https://user@example.com/".insteadOf "https://example.com/"统一重写,或者给子模块单独配凭证助手。注意凭证别写进仓库内的.git/config后再提交,那是把密码明文送出去。

现象三:本地怎么都正常,CI 里偶发失败。根因多半是 CI 缓存了.git目录,但 promisor 配置在缓存的目录里丢了。partial clone 的按需拉取依赖remote.origin.promisor=true这条配置,配置没了,Git 就认为缺失的对象是损坏,直接报错。处置:缓存前把git config --get remote.origin.promisor写进缓存键,或者在 CI 脚本开头强制git config remote.origin.promisor true,把配置补回来。

5.2 完整性与版本号异常

现象四:LFS 跟踪的文件打开只有两三行文本,内容是version https://...。根因是目标机器没装 LFS 客户端,或者 clone 时 smudge 被跳过而后续忘了拉。处置:git lfs install --local后执行git lfs pull,用git lfs ls-files确认状态。如果文件已经被当成普通文本提交过,光 pull 补不回来,得先git lfs migrate再重来,代价很大,所以第一次 clone 就要确认 LFS 装好了。

现象五:构建产物版本号是0.0.0,或者git describe报No names found。根因是浅克隆没带 tag,用 tag 推导版本的工具链拿不到任何参照。处置:git fetch --tags把 tag 补上;如果 tag 指向的历史 commit 也不在浅历史里,还得--deepen到那个 commit。这类问题最隐蔽的地方在于它不报错,只是静默生成一个错误版本号,等到发布之后才发现。

现象六:sha256 校验不一致,但文件肉眼看着一样。根因是行尾转换。仓库内部统一存 LF,检出时如果core.autocrlf是true,Windows 上会变成 CRLF,再算 sha256 自然对不上;反过来在 Linux 上校验一个 Windows 产出的文件也一样。处置:对需要跨平台校验的仓库设git config core.autocrlf input,并且校验基于仓库内的 blob 而不是工作区文件——git hash-object拿到的哈希不受行尾影响。

现象七:检出时报“文件名冲突”或干脆少文件。根因是文件系统大小写不敏感,仓库里同时存在Foo.txt和foo.txt,检出一个就覆盖另一个。处置:git config core.ignorecase false让 Git 明确感知大小写,配合git ls-tree -r HEAD | sort -f | uniq -di找出冲突路径,再决定改哪一边。这个坑在跨平台协作里出现频率不低,尤其历史上有过重命名操作之后。

6. 把一次下载固化成快照:清单脚本与复现习惯

真正省时间的不是下载快,而是下次能一模一样地重来。我在每个需要长期维护的项目里放一个fetch.sh,把 clone 参数、commit sha、依赖版本、校验和全写进去,任何人拿到它都能还原出同一份环境。

#!/usr/bin/env bash set -euo pipefail REPO="https://example.com/group/project.git" REF="${1:-main}" # 允许覆盖分支,默认 main WORK="./vendor/project" # 1) 按需克隆:只取目标分支的最新历史,随后按需加深 if [ ! -d "$WORK/.git" ]; then git clone --filter=blob:none --no-checkout --branch "$REF" "$REPO" "$WORK" git -C "$WORK" sparse-checkout init --cone git -C "$WORK" sparse-checkout set src build git -C "$WORK" checkout "$REF" fi # 2) 记录精确状态,写进清单 SHA=$(git -C "$WORK" rev-parse HEAD) { echo "repo=$REPO" echo "ref=$REF" echo "commit=$SHA" echo "fetched_at=$(date -u +%Y-%m-%dT%H:%M:%SZ)" echo "filter=$(git -C "$WORK" config --get remote.origin.partialclonefilter || echo none)" } > "$WORK/../FETCH_MANIFEST" # 3) 完整性自检,失败即中止 git -C "$WORK" fsck --full --strict >/dev/null echo "ok commit=$SHA"

脚本里三处设计值得说。第一处是“已存在就跳过 clone”,这让它可以重复执行,第二次跑只做校验,不会把目录覆盖掉。第二处是清单里记partialclonefilter,因为同一个 commit 用不同过滤参数拉下来,本地能做的事不一样——记下来,下次排查“为什么某个文件不在”时能直接对上。第三处是set -euo pipefail加fsck,校验失败就中断,绝不带着半个损坏的仓库继续往下走。

清单字段建议固定成这几项,多一个少一个都影响复现:

字段作用缺失后果
repo源地址换环境后不知道从哪拉
commit精确版本只能靠分支名猜,结果不可复现
filter克隆过滤参数无法解释文件缺失
fetched_at拉取时间排障时无法对齐上游变更
校验和清单文件完整性损坏无法定位到具体文件

从那以后我每次往新环境搬仓库,都强制走一遍“clone 或 bundle → 生成清单 → fsck 或 sha256 校验”这三步,不管多急。有两次就是因为跳过了最后一步,带着一个截断的 packfile 上生产,构建报的错跟真实原因差了十万八千里,排查花了整整一下午。这份资料里整理的命令模板和校验脚本我都放进了同一个目录,按简介里写的方式取就行,改改地址就能用在自己的项目上。希望帮到你。

本文还有配套的精品资源,点击获取

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/11/6 5:31:21

Flash游戏服务器:select单线程与TCP封包主循环

简介&#xff1a;一套面向Flash小游戏与后端服务通信学习的客户端—服务器配套示例&#xff0c;围绕TCP连接与select I/O多路复用展开&#xff1a;Flash赛车小游戏作为客户端&#xff0c;与控制台服务器交换动作指令、状态和反馈数据&#xff0c;帮助读者理解小型网络游戏的通信…

作者头像 李华
网站建设 2026/11/6 5:30:47

VC6 MFC老工程PNG透明贴图:GDI+预乘Alpha实战

简介&#xff1a;面向仍在 VC6.0 下维护 C/MFC 项目的开发者&#xff0c;这份压缩包围绕 PNG 图片加载与透明化处理&#xff0c;提供一套可编译的 GDI 集成示例&#xff0c;适合需要兼容老工具链、实现图片 Alpha 通道绘制、颜色矩阵调整或窗口透明效果的读者参考。包内共 70 个…

作者头像 李华
网站建设 2026/11/6 5:28:31

LAS点云Classification到PointNet++语义分割全链路

简介&#xff1a;面向希望在自有点云数据上复现PointNet与PointNet语义分割流程的开发者与研究者&#xff0c;这组材料围绕带Classification属性的LAS点云&#xff0c;提供了可直接用于训练、验证和预测的样例数据&#xff0c;并保留两套网络实现&#xff0c;方便在同一批数据上…

作者头像 李华
网站建设 2026/11/6 5:27:35

VC老工程复活:坦克RPG源码的Win32拆解与二次开发

简介&#xff1a;这是一份基于VC8.0与DirectX9.0 SDK开发的重装机兵&#xff08;MetalMax&#xff09;复刻游戏及配套源码包&#xff0c;面向想研究2D角色扮演游戏实现、学习C与DirectX项目组织的开发者及游戏爱好者。压缩包共545个文件&#xff0c;约6.97MB&#xff0c;以png纹…

作者头像 李华
网站建设 2026/11/6 5:27:19

开源7B/14B模型反超同规模SOTA:数据清洗、分词器与对齐流水线是关键

简介&#xff1a;面向大模型开发者、人工智能研究者与进阶学习者的技术资料&#xff0c;以单份PDF收录通义千问Qwen1官方技术报告&#xff0c;重点解决开源大语言模型技术路线不清、论文要点难梳理的问题&#xff0c;适合论文研读、课程汇报与应用选型参考。压缩包共1个文件&am…

作者头像 李华