Git + Linux 命令音视频开发常用清单
音视频工程师每天用的 Git / Linux 命令清单。不是所有命令都要背,但这一篇里的命令至少要做到:看到知道用途、排查时能快速复制、危险命令先确认影响范围。
本文速览
| |
|---|
| 0. 速查目标 | 明确 Git / Linux 命令在音视频开发里的分工 |
| 1. Git 进阶 | 大文件、子模块、rebase、bisect、stash、reflog |
| 2. Linux find(找文件) | |
| 3. grep(找文本) | 查源码、查日志、按上下文 / 正则 / 文件类型过滤 |
| 4. awk / sed(文本处理) | |
| 5. 进程管理 | |
| 6. 文件 IO | 查看文件、看大小、复制移动、diff / vimdiff |
| 7. 网络 | |
| 8. 性能 / 系统监控 | |
| 9. 文本批处理 | |
| 10. 文件压缩 | |
| 11. 音视频开发常用组合 | FFmpeg / so / logcat / strip / rsync / parallel 高频组合 |
| 12. 别名 | |
| 13. 总结 | Top 10 Linux / Git 命令记忆锚点 |
0. 速查目标
| | |
|---|
| Git | LFS / submodule / rebase / bisect / stash / reflog | 管大仓、管 FFmpeg / VLC 子模块、定位回归 commit、救回误删提交 |
| Linux | find / grep / rg / awk / sed / ps / kill / IO / 网络 / 系统监控 | 找源码、查日志、批量改代码、看进程、抓包、定位性能瓶颈 |
| 组合命令 | | |
1. Git 进阶
1.1 大文件 / 大仓库(音视频常见)
1.1.1 Git LFS(Large File Storage)
| | |
|---|
| 初始化 LFS | git lfs install | |
| 跟踪视频文件 | git lfs track "*.mp4" | |
| 跟踪动态库 | git lfs track "*.so" | |
| 跟踪 AAR | git lfs track "*.aar" | |
| 提交 LFS 规则 | git add .gitattributes | |
| 提交大文件 | git add big_video.mp4 | |
| 提交版本 | git commit | |
| 推送远端 | git push | |
FFmpeg / VLC 项目的 .so、样片、模型文件都适合用 LFS 管理。
1.1.2 浅克隆
| | |
|---|
| 只拉最近 1 个 commit | git clone --depth=1 <url> | |
| 只拉某个分支 | git clone -b master --single-branch <url> | |
大仓库(VLC / Chromium)可以从几 GB 降到几百 MB。
1.2 Submodule(子模块)
| | |
|---|
| 添加 submodule | git submodule add https://github.com/xxx/yyy.git extra/yyy | |
| 克隆时带 submodule | git clone --recursive <url> | |
| 克隆后初始化 | git submodule update --init --recursive | |
| 更新到远端最新 | git submodule update --remote | |
| 查看状态 | git submodule status | |
ijkplayer / VLC 常用 submodule 管 FFmpeg 等依赖。
1.3 Rebase(重写历史)
| | |
|---|
| 同步主干 | git rebase main | |
| 整理最近 5 个提交 | git rebase -i HEAD~5 | squash / reword / drop commit |
| 冲突后继续 | git rebase --continue | |
| 放弃 rebase | git rebase --abort | |
用 rebase 整理 commit 历史通常比 merge 更整洁。
1.4 Bisect(二分查 bug)
| | |
|---|
| 1 | git bisect start | |
| 2 | git bisect bad HEAD | |
| 3 | git bisect good v1.0 | |
| 4 | git bisect good | |
| 5 | git bisect bad | |
| 6 | git bisect reset | |
音视频回归 bug 找罪魁时很有用,尤其是“上周还好,这周坏了”的问题。
1.5 Cherry-pick(挑 commit)
| | |
|---|
| 挑单个 commit | git cherry-pick abc1234 | |
| 挑多个 commit | git cherry-pick abc1234 def5678 | |
| 只拿改动不提交 | git cherry-pick -n abc1234 | |
热修复常见流程:master 修了 → cherry-pick 到 release 分支。
1.6 Stash(暂存)
| | |
|---|
| 暂存当前改动 | git stash | |
| 恢复并删除 stash | git stash pop | |
| 恢复但保留 stash | git stash apply | |
| 查看 stash 栈 | git stash list | |
| 删除某个 stash | git stash drop stash@{0} | |
| 带名字暂存 | git stash push -m "wip: refactor decoder" | |
切分支前没改完的代码,stash 一下。
1.7 Reflog(找回丢失的 commit)
| | |
|---|
| 查看本地 HEAD 操作历史 | git reflog | reset / checkout / commit 都能看到 |
| 找回被 reset 的提交 | git checkout abc1234 | |
| 恢复成分支 | git branch recovered abc1234 | |
误操作 git reset --hard 后用 reflog 救命。
1.8 .gitignore 速查
| | |
|---|
| 二进制目标文件 | *.o | |
| 动态库 | *.so | Android / Linux native 产物 |
| 静态库 | *.a | |
| APK | *.apk | |
| IDE 配置 | .idea/ | JetBrains / Android Studio 工程配置 |
| VSCode 配置 | .vscode/ | |
| IntelliJ 模块文件 | *.iml | |
| 构建目录 | build/ | |
| 输出目录 | out/ | |
| 大视频文件 | *.mp4 | |
| 保留样片例外 | !sample.mp4 | |
2. Linux find(找文件)
2.1 基础
| | |
|---|
找当前目录所有 .c 文件 | find . -name "*.c" | |
| 大小写不敏感 | find . -iname "*.c" | |
| 找目录 | find . -type d -name "audio" | |
| 找文件 | find . -type f -name "*.cpp" | |
2.2 大小
| | |
|---|
| 大于 100MB 的文件 | find . -type f -size +100M | |
| 小于 1KB 的文件 | find . -type f -size -1k | |
2.3 时间
| | |
|---|
| 最近 7 天修改 | find . -mtime -7 | |
| 30 天前的文件 | find . -mtime +30 | |
2.4 组合操作
| | |
|---|
找到 .o 文件并删除 | find . -name “*.o” -delete | |
找到 .o 文件并执行 rm | find . -name “*.o” -exec rm {} ; | |
找到 .c 文件并 grep | find . -name “*.c” -exec grep -l “av_read_frame” {} ; | |
3. grep(找文本)
3.1 基础
| | |
|---|
| 搜索普通文本 | grep "av_read_frame" file.c | |
| 忽略大小写 | grep -i "AV_READ" file.c | |
| 显示行号 | grep -n "..." file.c | |
| 递归搜索目录 | grep -r "..." . | |
| 只列出文件名 | grep -l "..." -r . | |
3.2 高级
| | |
|---|
| 显示后 3 行上下文 | grep -A 3 "..." file | |
| 显示前 3 行上下文 | grep -B 3 "..." file | |
| 显示前后 3 行 | grep -C 3 "..." file | |
| 反向过滤 | grep -v "..." file | |
| 扩展正则 | grep -E “av_(read|write)_frame” file.c | |
| 排除目录 | grep -r "..." . --exclude-dir=build | |
| 只搜某文件类型 | grep -r "..." --include="*.c" | |
3.3 ripgrep(rg,速度更快)
| | |
|---|
| 安装 | sudo apt install ripgrep | |
| 搜索代码 | rg "av_read_frame" | |
| 只搜 C 文件 | rg "av_read_frame" -t c | |
找代码优先用 rg,找非常老的系统再用 grep。
4. awk / sed(文本处理)
4.1 awk 速学
| | |
|---|
| 打印第 2 列 | echo “a b c” | awk ‘{print 3}’ file.txt | |
| 按列求和 | awk ‘{sum += 3 > 100 {print}’ data.txt | |
| 处理 logcat | adb logcat | awk ‘/MediaCodec/ {print $1, $2, (nproc) | |
| 跨工程并行 | parallel -j 4 ::: command1 command2 command3 | |
12. 别名(节省时间)
~/.bashrc 或 ~/.zshrc 里可以按需加入下面这些 alias:
| | | |
|---|
| Git | gs | git status | |
| Git | gd | git diff | |
| Git | gc | git commit | |
| Git | gp | git push | |
| Git | gl | git log --oneline --graph | |
| Android | adbs | adb shell | |
| Android | adbl | adb logcat | |
| Android | adbi | adb install | |
| Android | adblog | adb logcat | grep -E “FATAL|MediaCodec|AudioTrack” | |
| FFmpeg | ffinfo | ffprobe -v error -show_format -show_streams | |
| FFmpeg | ffplay-rgb | ffplay -f rawvideo -pixel_format rgb24 | |
| 常用 | ll | ls -lh | |
| 常用 | la | ls -lha | |
| 常用 | .. | cd .. | |
| 常用 | ... | cd ../.. | |
13. 总结
Top 10 Linux
| | |
|---|
| 1 | rg | |
| 2 | find | |
| 3 | ps | |
| 4 | tail -f | |
| 5 | vim | |
| 6 | cd | |
| 7 | cat | |
| 8 | du -sh | |
| 9 | scp | |
| 10 | sed | |
Top 10 Git
| | |
|---|
| 1 | git status / add / commit / push / pull | |
| 2 | git log --oneline --graph | |
| 3 | git stash | |
| 4 | git rebase -i | |
| 5 | git bisect | |
| 6 | git cherry-pick | |
| 7 | git submodule | |
| 8 | git lfs | |
| 9 | git reflog | |
| 10 | .gitignore | |
金句:写代码 80% 时间在改 / 看 / 调试 / 找。Linux 命令熟练度跟 IDE 同等重要,30 个核心命令是进阶 NDK 工程师的“无形武器”。