ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

Termux + Git + SSH:安卓手机推送代码到 GitHub 全流程

2026/10/1 4:53:51 拓冰建站 浏览量
Termux + Git + SSH:安卓手机推送代码到 GitHub 全流程 1. 先想清楚场景手机上的 Git 到底解决什么问题在通勤路上、在排队等人的间隙脑子里突然冒出一段脚本要改或者笔记里有个错别字想顺手修掉而手边只有一台安卓手机——这个场景我碰到过太多次了。Termux 的价值就在这儿它把安卓设备变成了一个不需要 root 就能跑起来的类 Linux 终端装上 Git 之后git init、git add、git commit、git push这一整套在电脑上做惯了的动作在手机上一样能跑通。GitHub 作为远端仓库负责把你的提交接住、存好、留痕。这三样东西凑在一起等于给手机配了一个随身携带的版本管理环境。这篇内容想解决的是一个非常具体的问题怎么在一台安卓手机上的 Termux 里把本地的一个项目完整地提交到 GitHub。不是泛泛地讲 Git 概念而是从装包、配置身份、生成密钥、建立本地仓库、关联远端一直到第一次推送成功中间每个环节都交代清楚操作意图和容易翻车的地方。适合三类人看一是手上经常只有手机、又想维护自己小项目的人二是刚接触 Git想找个低成本环境练手的人三是已经在电脑上用 Git、想在手机上补一条链路的人。1.1 Termux 这个环境的真实长相先跟电脑终端对齐一下认知很多人第一次进 Termux 会觉得它和电脑上的终端没什么区别敲ls、cd、mkdir都正常装个包也就一条命令。但它的内核其实是一个 Android 应用进程运行在应用沙箱里家目录是/data/data/com.termux/files/home而不是常见的/home/用户名。这个路径不直观但它有个实实在在的好处这个目录在应用私有空间里支持完整的文件权限、支持符号链接、支持可执行位Git 仓库放这儿不会出幺蛾子。另外就是权限问题。Termux 是以普通应用身份运行的没有 root。你在里面敲su会直接看到su: not found或者类似no su program found on this device的提示。这不是你的设备坏了也不需要去折腾什么提权方案——我们这套提交流程从头到尾都不需要 root 权限Git 只关心你对自己家目录里的文件有没有读写权这一点是天然满足的。想通这一层就不会在无关的地方浪费时间。还有一点容易被忽略Termux 的包管理用的是pkg它其实是对apt的一层封装底层源是 Termux 自己维护的仓库。这意味着它能装到的东西和标准 Debian 不完全一样有些包名字一样、版本不同有些包干脆没有。Git 和 OpenSSH 都在源里装起来没有任何门槛但如果你打算顺带装一些 GUI 相关的依赖那就要提前做好心理准备。1.2 为什么把提交动作放在手机上做逻辑上是成立的Git 是分布式版本控制系统这句话不是口号它直接决定了手机端能做什么。你执行git clone之后本地拿到的是一份包含完整历史的仓库不是一份需要联网才能查看的副本。之后的git add、git commit、git log、git diff、git branch、git merge全部在本地完成一次网络请求都不发。只有git fetch、git pull、git push这三个动作需要跟远端通信。这个特性带来的直接结果是你可以在完全没有网络的情况下写一整天代码把提交攒成十几个等到有网络的地方一次性推上去。手机端的碎片时间正好适合这种节奏。反过来如果 Git 是集中式的每次提交都要连服务器那手机端做这件事的意义就大打折扣了。还有一层是心理上的。电脑上写代码往往有一种要坐下来正经干的仪式感手机上没有你掏出手机改两行、提交一次、继续做别的事门槛低得多。我自己的很多笔记整理、配置文件的修补、脚本的小改动都是在手机上完成的累积下来一年也有几百次提交。1.3 动手前必须敲定的三个决策定错了后面全是坑第一是仓库放在哪个目录。Termux 的家目录~/是首选路径短、权限全、操作快。很多人习惯把项目放在/sdcard下觉得这样文件管理器也能看到方便。但/sdcard是安卓的共享存储它挂载时通常带noexec不支持符号链接文件权限也被统一成固定值。Git 在里面工作会时不时报权限相关的怪异错误而且速度明显慢。我的建议是仓库放~/需要跟外部交换文件时再通过~/storage/shared这个软链接去拷贝这条软链接是termux-setup-storage命令自动建的。第二是身份信息用什么。Git 每次提交都会把user.name和user.email写进 commit 对象里这是不可更改的历史记录。同一台手机上如果你要维护公司项目和个人项目两套身份混着用会很难看。后面第 5 章会讲条件配置的写法这里先记住全局配置只设一次特殊仓库用局部配置覆盖。第三是认证走哪条路。HTTPS 加访问令牌还是 SSH 密钥。两者都能用但体验差别不小。SSH 配好之后一次都不用再输凭据推送体验最顺HTTPS 加令牌的好处是令牌权限可以精细控制、随时吊销坏处是每次推送都可能要重新认证除非你开凭据缓存。手机端我强烈推荐 SSH理由下面会展开。2. 环境准备把装包和初始配置一次做对准备阶段大概花十分钟但这十分钟如果做得草率后面会反复回来补。很多人卡在命令敲了没反应推上去报权限错误追到根上其实都是这一章没做干净。2.1 装包与目录规划先跑通最基础的三条命令Termux 装完之后第一件事是更新包索引这一步建议每次都先做因为冷启动的源索引可能是几个月前的快照直接装包会拉到旧版本甚至报找不到包pkg update pkg upgrade -y升级过程中如果弹出配置文件冲突的提示通常形如*** default config file has been modified选择保留原有配置即可别手快选覆盖那可能把你之前的~/.bashrc改掉。升级完装核心三件套pkg install -y git openssh nanogit是主角openssh提供ssh-keygen、ssh、ssh-agent这一套工具后面生成密钥和验证连接全靠它nano是编辑器用来写提交信息。装完确认一下版本git --version ssh -V两个命令都能打出东西来说明环境就绪。如果git --version报command not found多半是pkg update那一步没成功重新跑一次并观察输出里有没有红字报错。接着处理存储权限。这条命令是给 Termux 申请访问共享存储的权限执行后会弹一个系统授权对话框点允许termux-setup-storage执行完再看家目录会多出一个storage目录里面有shared、downloads、dcim等几个软链接。~/storage/shared就对应手机文件管理器里的内部存储根目录。注意这是单向的软链接你在~/storage/shared/foo下建文件文件管理器和电脑之间能互相看到但 Git 仓库本身不建议建在这里原因前面讲过。提示如果你的设备是 Android 5.1 这类较老的系统版本新版 Termux 可能装不上需要在官方发布页按系统版本挑一个能安装的老版本。老版本的包源状态和当前版本不同pkg update可能失败这种情况下建议先跑pkg update看看报错内容再决定是继续用还是换设备。2.2 全局配置身份、分支名、换行符一个都别落下装完包之后立刻配身份信息这决定了你所有提交的署名git config --global user.name 你的名字 git config --global user.email 你的邮箱邮箱这里有个细节值得说。如果你希望 GitHub 上的提交能正确归属到你的账号邮箱必须是你 GitHub 账号里验证过的邮箱之一。想隐藏真实邮箱的话GitHub 在设置里提供了noreply形式的专用邮箱形如一串数字用户名users.noreply.github.com用它也能正常归属。别随便填一个不存在的邮箱那样提交是能成功但在 GitHub 上会显示成无归属的灰色头像事后想改就得重写历史非常麻烦。接下来几条配置属于不配也能跑但配了少踩坑的类型git config --global init.defaultBranch main git config --global core.autocrlf false git config --global core.quotepath false git config --global core.editor nano git config --global color.ui auto git config --global pull.rebase false逐条说下理由。init.defaultBranch main让新建仓库的默认分支叫main而不是master跟 GitHub 现在的默认保持一致省掉一次改名操作。core.autocrlf false是因为 Termux 是类 Unix 环境本来就该用 LF 换行设成input会在提交时做一次转换设成true更糟会在工作区写入 CRLF导致那些跨手机和 Windows 协作的脚本跑起来莫名其妙地报\r: command not found。所以在手机上直接关掉自动换行转换是最省事的做法。core.quotepath false解决的是中文文件名显示问题。默认情况下 Git 会把非 ASCII 文件名转义成一串八进制git status里看到全是\344\275\240\345\245\275.txt这种东西眼睛直接瞎掉。关掉之后就能正常显示中文。core.editor nano是给git commit不带-m时用的编辑器手机上用 nano 比 vim 友好至少退出逻辑简单。pull.rebase false是把git pull的默认行为设为合并避免新版 Git 因为没有显式配置而每次拉取都弹警告。配完检查一遍用带来源的列表命令能清楚看到每条配置来自哪个文件git config --list --show-origin输出里file:/data/data/com.termux/files/home/.gitconfig开头的那些就是全局配置逐条确认没有拼写错误。2.3 SSH 密钥一次配置之后推送再也不用输密码手机端用 SSH 的收益比电脑上更大原因很实在手机上输密码本来就痛苦还要输一长串访问令牌输错一次就得重来。SSH 配好之后git push就是回车一下的事。生成密钥用 ed25519 算法它比 RSA 短、快安全性也够ssh-keygen -t ed25519 -C 你的邮箱执行后会问你三个问题。第一个是保存路径直接回车用默认的~/.ssh/id_ed25519第二个是密钥口令passphrase可以留空也可以设一个设了的话每次用密钥都要输入除非配合ssh-agent第三个是确认口令。手机端我的习惯是设一个口令然后用ssh-agent缓存兼顾安全和便利。生成完看一眼目录应该有一对文件ls -l ~/.sshid_ed25519是私钥绝不能外传id_ed25519.pub是公钥内容可以随便贴。顺手检查一下权限OpenSSH 对权限很挑剔权限太松会直接拒绝使用私钥chmod 700 ~/.ssh chmod 600 ~/.ssh/id_ed25519 chmod 644 ~/.ssh/id_ed25519.pub然后把公钥内容打印出来整行复制cat ~/.ssh/id_ed25519.pub复制的时候注意从ssh-ed25519开头一直到末尾的邮箱中间一个字符都不能少也不能多出换行。Termux 上长按屏幕选中文本选完点复制粘到 GitHub 网页端的 SSH 密钥设置页里标题随便起一个能认出来的名字比如我的安卓手机保存。最后验证连接这一步会明确告诉你配好没配好ssh -T gitgithub.com第一次连接会问你是否信任主机指纹输入yes回车。成功的话会看到类似Hi 用户名! Youve successfully authenticated...的提示。注意末尾那句but GitHub does not provide shell access是正常的它只是在说 GitHub 不提供交互式 shell不影响 Git 操作。如果密钥不止一个比如你还有别的用途的密钥可以在~/.ssh/config里显式指定用哪一把Host github.com HostName github.com User git IdentityFile ~/.ssh/id_ed25519 IdentitiesOnly yesIdentitiesOnly yes这一条很关键它告诉 SSH 只用指定的这把密钥去尝试不要把所有密钥挨个试一遍。不加这一条在某些服务器上会因为尝试次数过多被直接拒绝。2.4 访问令牌HTTPS 方式的备选通道有些场景下 SSH 就是走不通比如你所在的网络对 22 端口有额外的访问策略那 HTTPS 加访问令牌就是备选方案。这里必须先澄清一个高频误区GitHub 早就取消了用账号密码做 HTTPS 认证的方式你在密码框里输账号密码会收到一条明确提示说密码认证已被移除要求改用个人访问令牌。所以令牌不是可选走 HTTPS 就必须要它。生成路径在 GitHub 网页端的设置里找到开发者设置下的个人访问令牌可以创建细粒度令牌或经典令牌。细粒度令牌能限定只对特定仓库、特定权限生效安全性更好但配置项多经典令牌配置简单勾一个repo范围就能覆盖绝大部分日常操作。日常个人使用经典令牌够用但记得给令牌设置有效期别选永不过期。用令牌的方式是把它当作密码填进去git clone https://github.com/用户名/仓库名.git # 提示输入用户名时填 GitHub 用户名 # 提示输入密码时粘贴令牌想省掉每次都粘贴的麻烦可以开凭据缓存git config --global credential.helper storestore会把凭据以明文形式写进~/.git-credentials。这在个人设备上问题不大但如果你把手机借给别人用或者设备上有别的应用能读到家目录风险就存在。更谨慎的做法是不开缓存或者只在单个仓库里开。我个人在手机上用的是 SSH只有在极少数必须走 HTTPS 的时候才临时粘贴令牌粘完就忘掉。3. 完整实操从空目录到推送成功前面都是铺垫这一章是真正跑一遍流程。我按全新项目和已有项目两种起点分别走一遍你可以根据自己的情况对号入座。3.1 在 GitHub 上建仓库时有几个选项要想明白网页端新建仓库需要决策的点其实就三个。仓库名建议用小写加连字符别用空格和中文路径里出现空格会在某些命令行场景下被迫加引号很烦。公开还是私有看内容性质个人笔记、配置文件、带敏感信息的脚本一律选私有别图省事选公开回头清理很麻烦。要不要勾初始化文件这一项是新手最容易出错的地方。如果你是在本地已经有一堆文件的目录里初始化仓库那 GitHub 上建仓库时不要勾选添加 README、不要勾选添加 .gitignore、不要选许可证三个都留空。原因在于一旦远端仓库有初始化提交而本地仓库是独立初始化的两边的历史没有任何共同祖先第一次推送会被拒绝报一个non-fast-forward的错误。新手碰到这个错误往往手足无措其实解决办法就是把远端的提交合并进来git pull --allow-unrelated-histories或者干脆重建一个空仓库。反过来如果是先建远端仓库、再用git clone拉到本地那三个初始化选项随便勾克隆下来就是完整的。这是两种起点别搞混。注意仓库建好之后GitHub 页面上会显示一个仓库地址有 HTTPS 和 SSH 两种形式。用 SSH 的话地址形如gitgithub.com:用户名/仓库名.git注意中间是冒号不是斜杠这个细节抄错了会一直报仓库不存在。3.2 本地初始化与首次提交每一步都在干什么假设你已经在~/projects/notes这个目录里攒了一堆文件现在想把它管起来。先进目录cd ~/projects/notes ls -a确认一下文件都在然后初始化git init这条命令做的事是在当前目录下创建一个.git子目录里面包含对象库、引用、配置等一整套东西。从这一刻起这个目录就是仓库的工作区了。注意git init不会动你已有的任何文件它只是加了一个隐藏目录所以不用担心文件被改动。接着看状态git status这时候你会看到所有文件都是未跟踪状态。Git 的暂存区概念值得用一句话说清楚工作区是你正在编辑的文件暂存区是你准备提交的快照仓库是已经提交的历史。git add是把工作区的改动放进暂存区git commit是把暂存区的内容固化成一个提交对象。这个中间层的存在让你可以只提交一部分改动而不是每次都必须全量提交。把文件加进来git add . git status再加一次状态能看到文件都变成了待提交的变更。如果里面混进了不想提交的东西比如缓存目录、日志文件、临时文件先别急着提交等下一节讲.gitignore。现在先做第一次提交git commit -m 初始化整理笔记目录提交信息用中文没问题但建议养成写清楚做了什么的习惯别写更新修改这种没有信息量的词。三个月后你自己看日志的时候会感谢现在的自己。首次提交完成后把分支名改一下如果之前已经配了init.defaultBranch main这一步可以跳过git branch -M main-M是大写的 M表示强制改名。用大写是因为如果main已经存在会拒绝执行加-M才覆盖。3.3 关联远端并推送第一次推送要加 -u 参数把远端地址加进来git remote add origin gitgithub.com:用户名/仓库名.git git remote -vgit remote -v用来核对会打印两行一行是 fetch 地址一行是 push 地址两行应该完全一样。如果发现自己地址抄错了直接改git remote set-url origin gitgithub.com:用户名/仓库名.git不需要先删再加set-url一步到位。想彻底删掉就git remote remove origin。然后推送git push -u origin main这里的-u是把本地main分支和远端origin/main建立追踪关系只需要在第一次推送时加。建立之后以后在这个分支上直接敲git push和git pull就行Git 知道该推到哪里、该从哪里拉。第一次推送如果没有报错回 GitHub 页面刷新文件都在上面了这一步就算通了。如果推送过程中卡住不动先别急着 CtrlC等三十秒左右。首次连接有时需要做密钥交换和 DNS 解析慢一点正常。超过一分钟还没动静再考虑是不是网络问题这个排查思路下一章展开。3.4 日常循环改、看、选、提交、推五步走完一次迭代配好之后日常使用就固定成一套循环我列个对照表顺便说清每一步的意图步骤命令这一步在解决什么看git status -s用精简格式看哪些文件变了-s输出两列状态码比完整格式清爽看细节git diff看具体改了哪几行避免把调试代码一起提交选git add 文件名或git add -p只把想提交的部分放进暂存区-p是交互式逐块选择精细到行提交git commit -m 说明固化成本地历史此时还是离线的推git push把本地提交同步到 GitHub这是唯一需要网络的步骤git add -p是我在手机上用得最多的一个参数。它会把每个改动块单独问你要不要加进来你按y加、按n跳过、按s拆分更小的块、按q退出。手机上写代码经常带着一堆调试语句用这个参数能干净地只提交真正想提交的部分而不是事后后悔。看历史用这两个git log --oneline --graph --all git log -3 --stat第一条把提交历史压缩成一行一条还画出分支图手机屏幕窄这种紧凑格式最好读。第二条看最近三次提交各自改了哪些文件。还有一个经常需要的操作是撤销。改错了想恢复到上次提交的状态git restore 文件名这条命令会把工作区里这个文件的改动丢掉恢复成暂存区里的版本。注意它不可逆丢掉的内容找不回来。如果只是想取消暂存、保留改动git restore --staged 文件名最后一个是提交完发现漏了一个文件或者提交信息写错了git add 漏掉的文件 git commit --amend -m 新的提交信息--amend是修改最近一次提交它会把新的改动合并进上一个提交对象。注意如果这个提交已经推送到远端了amend 之后本地和远端的历史就不一致了再推需要git push --force-with-lease。这个操作在多人协作的仓库里要慎重个人仓库随便用。3.5 把已有仓库搬进手机克隆这条路要走对如果你要维护的是一个已经在 GitHub 上的项目那起点是克隆不是初始化cd ~/projects git clone gitgithub.com:用户名/仓库名.git cd 仓库名克隆下来的是完整仓库包含所有历史、所有分支的引用、所有标签。默认落在main分支上或者远端设定的默认分支。想确认一下git branch -a git log --oneline -5branch -a会列出本地分支加上远端分支-a的意思就是 all。如果远端有多个分支本地只会有默认分支对应的那个其他分支以remotes/origin/xxx的形式存在想切过去git switch 分支名这里提一个手机端特别实用的参数--depth。有些仓库历史非常长完整克隆下来几百兆手机存储和网络都吃不消。这时候用浅克隆git clone --depth 1 gitgithub.com:用户名/仓库名.git--depth 1表示只拉最近一次提交历史被截断。代价是没法看完整历史、没法直接切到很久以前的分支如果你只是想在手机上改点东西再推回去浅克隆完全够用。需要补全历史的时候执行git fetch --unshallow就能拉回来。3.6 .gitignore 和路径问题手机端最容易踩的两个坑.gitignore的作用是告诉 Git 哪些文件不用管。写法很简单一个文件一行规则支持通配符# 依赖目录 node_modules/ __pycache__/ *.pyc # 编辑器与系统文件 .vscode/ *.swp .DS_Store # 敏感信息 .env *.key config.local.sh # 大文件与产物 *.zip *.apk build/ dist/规则有几个容易搞错的地方。以/结尾表示只匹配目录*不跨目录匹配**才跨以!开头表示反向排除但如果父目录已经被忽略子文件的!规则不生效这是最常见的坑解决办法是先把父目录放行再排除子项写成/build/*加!/build/keep.md这种形式。如果文件已经被提交过再加进.gitignore是不起作用的因为 Git 已经在跟踪它了。需要先把它从索引里摘掉同时保留工作区文件git rm -r --cached 目录名 git commit -m 停止跟踪生成产物--cached这个参数的含义是只从索引里删工作区的文件别动少了它文件会被真的删掉非常危险。手机上误删文件找回的难度比电脑高很多所以这条命令敲之前一定要看清楚参数。第二个坑是路径。前面反复提过仓库要放在~/下。如果确实需要把/sdcard上的东西纳入版本管理一个好办法是用软链接把仓库建在家目录然后从仓库里链过去。反过来的做法也就是把仓库建在/sdcard会因为文件权限和符号链接支持的问题在涉及可执行脚本、Git 钩子的场景下频繁报错不值得折腾。4. 常见问题与排查速查表这一章是踩坑记录基本覆盖了手机端搞 Git 会撞到的问题。我按症状分类每类给出判断依据和解决路径。4.1 认证类问题从报错原文直接定位症状一Permission denied (publickey)。这句话的含义很明确SSH 握手完成了但 GitHub 没有接受你提供的任何密钥。常见原因有四个公钥根本没上传到 GitHub上传了但粘贴时被截断或多了换行私钥文件权限太松ssh-agent里加载的是另一把密钥。排查顺序建议这样先跑ssh -T gitgithub.com加-v参数看详细握手过程ssh -T -v gitgithub.com 21 | grep -i identity\|offering\|accepted输出里会明确列出尝试了哪些密钥文件、服务端接受了哪一个。如果看到Offering public key: ...后面跟的是你不期望的路径那就是密钥选错了用前面 2.3 节的~/.ssh/config方式显式指定。如果所有密钥都被拒那就回到 GitHub 页面确认公钥是否真的保存成功内容是否和cat ~/.ssh/id_ed25519.pub的输出逐字符一致。症状二Support for password authentication was removed。这个报错说明你在用 HTTPS 方式认证并且填了账号密码。解决办法是用访问令牌见 2.4 节。注意如果你之前用credential.helper store缓存过一个错误的密码光换令牌还不行得先清掉缓存文件rm ~/.git-credentials然后重新推送让它重新问一次凭据。症状三Repository not found。这个报错会骗人因为权限不足时 GitHub 也会返回同样的提示目的是不泄露私有仓库是否存在。所以如果你确定仓库名拼对了就要检查三件事这个仓库是不是你的、你的账号有没有被授予访问权、你当前用的 SSH 密钥或令牌对应的账号对不对。手机上一个很常见的情形是之前登过另一个账号凭据缓存里留着旧的推送时用的还是旧身份。4.2 连接类问题先分清是网络还是认证连接卡住或者超时第一步是分层判断别一上来就瞎改配置。跑这条命令ssh -T gitgithub.com如果它卡在Connecting to github.com很久然后超时说明问题在建立连接这一层跟认证无关改密钥没用。如果它很快返回Permission denied说明网络是通的问题在认证按 4.1 处理。确认网络层是否可达可以用 ping 看域名解析和基本连通性ping -c 4 github.com如果 ping 能通但 SSH 连不上说明是端口层面的策略不同因为 ping 走的是 ICMP而 SSH 走的是 TCP。也可以看看 DNS 解析出来的地址nslookup github.com手机上切换网络环境是成本最低的验证手段从 Wi-Fi 切到移动数据或者反过来再跑一次ssh -T。如果切换后立刻通了那就是原来那个网络的问题跟你本地配置无关。另外提醒一句Termux 里跑长任务时安卓的省电策略可能会在息屏后把进程挂起导致git push卡在半路。跑之前先申请唤醒锁termux-wake-lock # 任务结束后释放 termux-wake-unlock这两个命令是 Termux 自带的不需要额外装包作用就是在任务期间阻止系统休眠。4.3 仓库状态类问题几个容易慌神的场景场景一failed to push some refs加non-fast-forward。这说明远端有你本地没有的提交可能是你在别的设备上推过东西也可能是建仓库时勾了初始化文件。稳妥的解法是先拉再推git pull --rebase origin main git push加--rebase是把你的本地提交挪到远端最新提交之后历史看起来是一条直线比默认的合并提交干净。如果拉的时候报refusing to merge unrelated histories说明两边完全没有共同祖先加参数强制合并git pull origin main --allow-unrelated-histories执行后如果有冲突按提示编辑解决然后git add冲突文件、git commit完成合并。场景二提交里混进了不该提交的文件。如果只有一个文件而且刚提交用git rm --cached 文件加git commit --amend就能修掉。如果是好几个文件先git reset --soft HEAD~1把最近一次提交退回暂存区这时改动都还在然后git restore --staged挑出不想要的重新提交。--soft的含义是只移动分支指针工作区和暂存区都不动这是三种 reset 里最温柔的一种手机上优先用它。场景三文件太大推不上去。GitHub 对单个文件有硬性上限超过就直接拒绝推送而且这个限制在推送时才会触发本地提交阶段毫无感知。所以提交前先扫一眼大文件find . -path ./.git -prune -o -type f -size 20M -print这条命令会列出所有超过 20MB 的文件排除.git目录。扫出大文件后要么加进.gitignore要么用git lfs管理需要pkg install git-lfs并执行git lfs install。如果大文件已经被提交进历史了光删掉再提交是没用的历史里还留着需要git filter-repo这类工具重写历史。手机上做这个操作很痛苦最好的策略是预防提交前扫一遍。4.4 Termux 专属问题跟 Git 本身无关的那些没有 root 怎么办。前面说过su报错是正常的我们的流程不需要它。有人会想装个带 root 的环境来跑 Git完全没必要反而增加复杂度。后台被系统杀掉。安卓会在内存紧张时回收后台应用Termux 也在回收范围内。表现是切回来发现命令中断了、git push只推到一半。除了前面说的termux-wake-lock还可以把 Termux 加入系统的电池优化白名单不同品牌的路径不一样一般在设置的电池或应用管理里能找到。包版本太旧。Termux 的源更新比较频繁如果git --version打出来的版本号明显偏低跑一次pkg upgrade git单独升级。注意升级前先pkg update刷新索引否则可能升级到的是索引里记录的旧版本。中文显示乱码。除了前面配的core.quotepath false还要确认终端的 locale 设置。检查一下echo $LANG返回en_US.UTF-8或类似的 UTF-8 编码就没问题。如果返回空或者非 UTF-8可以在~/.bashrc里补一行export LANGen_US.UTF-8然后source ~/.bashrc。4.5 问题排查速查表现象大概率原因首选动作Permission denied (publickey)公钥未上传或密钥选错ssh -T -v gitgithub.com看尝试了哪把密钥Support for password authentication was removed用了账号密码而非令牌生成访问令牌清掉旧的凭据缓存Repository not found仓库名错或权限不足核对地址、账号、密钥归属卡在Connecting后超时连接层不通非认证问题切换网络环境复测确认域名解析正常non-fast-forward远端有本地没有的提交git pull --rebase后重新推推送提示文件过大单文件超出上限find扫大文件移出版本控制或改用 LFS提交里有中文文件名的乱码quotepath未关git config --global core.quotepath false息屏后任务中断系统回收后台进程termux-wake-lock加电池优化白名单5. 提效技巧与个人心得流程跑通之后值得花点时间把常用的东西固化下来。手机端敲命令的成本比电脑高每少敲几个字符长期收益都很明显。5.1 别名配置把长命令变成两三个字母在~/.bashrc里加一组别名用nano ~/.bashrc编辑在末尾追加alias gsgit status -s alias gagit add alias gcgit commit -m alias gpgit push alias glgit log --oneline --graph -10 alias gdgit diff alias gcogit switch alias glastgit log -1 --stat加完执行source ~/.bashrc生效。之后一次完整的提交流程就变成gs、ga .、gc 说明、gp四行搞定。我用了很久之后发现手机上阻碍你提交的从来不是 Git 复杂而是打字累别名解决的就是这个。还可以定义一个函数一键完成全部添加加提交加推送适合那种纯粹为了同步而非精细控制的场景syncpush() { git add -A git commit -m ${1:-同步 $(date %Y-%m-%d %H:%M)} git push }用的时候敲syncpush 随手记不带参数就用时间戳当提交信息。这个函数适合笔记类仓库不适合有多人协作的代码仓库因为-A会把所有改动一锅端容易把调试代码一起推上去。5.2 一套终端管多个身份靠条件配置隔离如果手机既要管公司的仓库又要管自己的用这套写法在~/.gitconfig里做目录级的身份切换[user] name 个人名字 email 个人邮箱 [includeIf gitdir:~/work/] path ~/.gitconfig-work然后在~/.gitconfig-work里写工作用的身份[user] name 工作名字 email 工作邮箱规则是只要仓库路径在~/work/下面就自动加载工作身份其他路径用个人身份。gitdir:前缀必须写路径末尾的斜杠也建议保留这样能匹配整个目录树。验证方法是进入工作目录下的某个仓库跑git config user.email看看输出的是不是工作邮箱。这个机制在手机上尤其有用因为手机往往同时充当个人工具和工作工具身份搞混了在提交历史里一眼就能看出来改起来还得重写历史。5.3 把私有仓库当同步盘用有几个细节要注意我在手机上有一个私有仓库专门放配置文件和笔记从电脑、手机、平板三处往里推当成一个低成本的同步方案。用下来有几个体会。别放大文件。同步盘的价值在文本二进制文件放进去会让仓库体积迅速膨胀克隆越来越慢。我的做法是仓库里只放文本图片和压缩包单独存需要时手动拷。提交粒度要小。手机上的提交往往是想到就改如果攒了十几个改动一起提交提交信息必然写得含糊以后想回溯某个改动是怎么来的翻不出来。我的习惯是一个逻辑改动一次提交哪怕只是多写了一句话。推送前先拉。多设备协作最容易出的问题就是两端都改了同一个文件。手机上因为操作环境是碎片化的忘记先拉的概率特别高。我的做法是把这个动作写进别名gp之前先跑一次git pull --rebase养成肌肉记忆。定期清理。仓库用久了会积累一些废弃文件偶尔跑一次git gc整理对象库能明显减小体积。5.4 什么时候不该在手机上硬扛有几类事我试过之后就不在手机上做了。大规模重构不划算手机上编辑多文件的效率太低改到一半忘了上下文。复杂合并冲突也一样冲突文件一多在窄屏上对照两份代码非常痛苦不如等有电脑的时候处理。仓库管理类操作比如重写历史、清理大文件、迁移仓库这些操作一旦出错修复成本高手机端没有可靠的备份手段风险不匹配收益。还有一个容易被忽略的点手机上做提交最好只做增量修改不要做结构调整。移动目录、批量改名这类操作会生成大量变更记录在手机上看 diff 根本看不清很容易漏掉某个文件的改动。这类操作留到电脑上做手机只负责小修小补和同步是我用下来最舒服的分工。最后分享一个我在实际使用中的小习惯手机上每次开一个新的小项目前我先用git init和一次空提交把仓库骨架搭好推上去然后再开始写内容。这样从第一天起就有远端备份中途换设备、手机重置、应用被清数据都不至于把东西弄丢。很多人是先写一堆东西再想起来建仓库这时候才做第一次配置往往手忙脚乱出错概率也高。提前十分钟搭好骨架后面所有改动都自动被版本管理接住这笔投入非常值。