大型Git仓库快速创建分支并保留工作目录状态的方案求助
你的问题我太懂了——加密文件系统下Git的文件扫描慢到离谱,尤其是仓库里文件多的时候。你现在用git checkout -b卡1小时,核心原因就是Git在切换分支时要遍历整个工作区,确认未提交的修改能不能保留,而加密FS拖慢了这个过程。给你几个高效的解决办法:
最优解决方案:先提交再创建分支,避免切换时的全目录扫描
这个方法能让分支创建和切换的耗时几乎可以忽略,核心思路是先把当前工作区的内容打包成一个提交,再让新分支指向这个提交,最后切换分支时因为工作区和目标分支完全一致,Git不需要做任何文件扫描:
# 1. 先把工作区所有变更同步到索引(这一步你原本就有,耗时可接受) git add -v -A # 2. 创建一个新的提交对象,基于当前索引,父提交为当前分支的HEAD # 这条命令会输出新提交的SHA值,我们把它存到变量里 NEW_COMMIT=$(git commit-tree HEAD^{tree} -m "at mynewbranch") # 3. 创建新分支并直接指向刚才生成的提交(瞬间完成) git branch mynewbranch $NEW_COMMIT # 4. 切换到新分支——因为工作区和新分支内容完全匹配,Git只需切换HEAD引用,几乎不耗时 git checkout mynewbranch
为什么这个方法更快?
git branch只是在Git的引用目录里创建一个新文件,完全不涉及工作目录的扫描;git commit-tree是Git的底层命令,直接操作对象库生成提交,不需要遍历工作区;- 最后一步
git checkout因为工作区和新分支的内容100%一致,Git会跳过所有文件检查,直接切换HEAD,瞬间完成。
进一步优化git add的速度
你提到希望add操作只检查有更新的文件,不用对比所有内容,可以做这两个调整:
- 禁用ctime信任:加密文件系统可能会修改文件的ctime(变更时间),导致Git误以为文件被修改。运行下面的命令让Git只通过mtime(修改时间)和文件大小判断文件是否变化:
git config --global core.trustctime false - 确保Git使用快速状态检查:Git默认会用
mtime+size做快速检查,如果你的版本没被修改过,这个配置是默认开启的,可以用下面的命令确认:
如果输出是git config core.checkStatdefault或minimal就没问题;如果是full,改成minimal:git config core.checkStat minimal
备选简化方案(不用底层命令)
如果你觉得底层命令有点复杂,也可以用这个更直观的流程,同样能避免全目录扫描:
# 1. 先创建新分支(不切换,瞬间完成) git branch mynewbranch # 2. 把当前工作区的变更提交到当前分支 git add -v -A git commit -q -m "at mynewbranch" # 3. 把新分支移动到这个新提交 git branch -f mynewbranch HEAD # 4. 回滚当前分支到提交前的状态(工作区会回到干净状态) git reset --hard HEAD^ # 5. 切换到新分支(此时工作区和新分支内容一致,瞬间完成) git checkout mynewbranch
不过这个方案会在当前分支产生一个临时提交然后回滚,不如第一个方案优雅,优先推荐第一个。
内容的提问来源于stack exchange,提问作者Marit Lendox
相关产品推荐
相关产品推荐

