Android repo技巧:强制同步远端服务器代码,但不覆盖开发分支

目前所知,使用 repo sync 同步远端服务器代码,不能强制覆盖本地修改。如果想要强制覆盖本地修改,可以用 repo forall -c 来执行git丢弃本地修改的命令,git checkout 和 git reset 命令都可以丢弃本地修改。

一般来说,可以使用 git checkout . 命令来丢弃当前目录下的改动,但是实际执行 repo forall -c git checkout . 命令会报错:

$ repo forall -c git checkout .
error: pathspec '.' did not match any file(s) known to git.

而使用 repo forall -c 'git reset --hard' 命令不会报错,可以用这个命令来丢弃所有git仓库的本地改动,然后再用 repo sync 命令来同步远端服务器代码。

在实际项目开发时,可能会在本地创建开发分支,这个分支没有关连到服务器分支。我们同步远端服务器代码,可能只是想获取到最新代码。此时,并不想丢弃本地开发分支的改动。但是上面的 repo forall -c 'git reset --hard' 命令无法区分这种情况,会丢弃开发分支的改动。

下面这个看起来很复杂的命令就用于解决这个问题,它先判断当前本地分支在远端服务器存在同名分支时,才强制覆盖本地修改并pull服务器代码:

repo forall -c "branch_name=$(git rev-parse --abbrev-ref HEAD) && git rev-parse --abbrev-ref ${branch_name}@{upstream} && git reset --hard && git pull --stat --no-tags" |& cat

对这个命令的各个部分说明如下。

  • repo forall -c:对所有git仓库都执行后面的跟着的命令,这里使用双引号把多个git命令都括起来,作为一个整体传给repo,可以做一些复杂的操作。
  • branch_name=$(git rev-parse --abbrev-ref HEAD):这是bash shell的语法, $(cmd) 会执行 cmd 命令,得到它的输出,这里把输出结果赋值给 branch_name 变量。git rev-parse --abbrev-ref HEAD 命令输出且只输出本地分支名。
  • &&:bash shell的与操作,前一个命令执行结果为true,才会执行下一个命令。
  • git rev-parse --abbrev-ref ${branch_name}@{upstream}${branch_name} 表示获取 branch_name 变量的值。branch_name 变量在前面被赋值为当前本地分支名。整个git命令获取本地分支在远端服务区分支名。如果获取不到,执行结果是false。
  • git reset --hard:基于 && 操作符的特性,如果上一个git命令获取不到本地分支在远端服务器的分支名,就不会往下执行。所以执行到这里时,说明本地分支名跟远端服务器分支名相同,我们假设本地开发分支没有关连到远端服务器分支,那么当前分支就不是开发分支,用 git reset 丢弃本地修改。
  • git pull --stat --no-tags:同步服务器代码,--stat 表示要打印发生改动的文件信息,--no-tags 表示不获取远端服务器仓库的tag信息。如果需要pull远端服务器的tag,可以不加 --no-tags 选项。
  • |& cat:把整个repo命令的标准输出、错误输出都重定向到 cat 命令。如果不重定向,repo 会用 less 命令来显示输出内容,需要手动按 q 退出才会继续输出,重定向到 cat 后,直接打印全部输出内容,不需要再手动进行其他操作。

PS:这里用到了我之前文章介绍的 “Git获取本地分支对应的远端服务器分支名” 和 “Git打印且只打印本地分支名” 的两个方法,来判断当前的开发分支是否存在于远端服务器,详细说明可以查看前面的文章。


南木阁
考据党一枚,力求讲述的每个知识点都有出处,有理有据。如能恰好地解答您的疑问,欢迎点赞,谢谢!

解读权威文档,编写易懂文章。如有恰好解答您的疑问,多谢赞赏支持~

405 声望
326 粉丝
0 条评论
推荐阅读
Linux技巧:介绍安装完整 man 手册和其他查看姿势
本篇文章介绍在 Linux 中安装完整 man 手册、去掉 man 手册中文版本、和导出 man 手册的方法。安装完整的 man 手册在 Debian 系统、Ubuntu 系统中,可以执行下面命令来安装完整的 man 手册。这会安装系统函数、库...

霜鱼片阅读 6.2k

浅谈App的启动优化
温启动:当启动应用时,后台已有该应用的进程,但是Activity可能因为内存不足被回收。这样系统会从已有的进程中来启动这个Activity,这个启动方式叫温启动。

xuexiangjys5阅读 1.6k

Git操作不规范,战友提刀来相见!
年终奖都没了,还要扣我绩效,门都没有,哈哈。这波骚Git操作我也是第一次用,担心闪了腰,所以不仅做了备份,也做了笔记,分享给大家。问题描述小A和我在同时开发一个功能模块,他在优化之前的代码逻辑,我在开...

王中阳Go5阅读 2.2k评论 2

封面图
Git 入门与实践
Git 入门与实践推荐:猴子都能懂的 GIT 入门Git --everything-is-loca 官方文档Git 教程-廖雪峰Git 的使用方式有很多。图形化 —— 小乌龟(Tortoise Git )、命令行—— git bash、IDE 集成等 ......目录1. 基础配置...

RainBow1阅读 2.2k

openKylin 0.9.5版本正式发布,加速国产操作系统自主创新进程!
2023年1月12日,中国桌面操作系统根社区openKylin(开放麒麟)正式发布openKylin 0.9.5操作系统版本。此版本充分适应5G时代需求,打通平板,PC等设备,实现多端融合,弥补了国产操作系统的短板,有效推动国产操作...

openKylin5阅读 7.1k

封面图
如何用3D流体实现逼真水流效果?
华为应用市场在2022年HDC大会期间发布了一款3D水流主题,基于华为HMS Core Scene Kit服务能力,展现立体灵动的水流岛屿,可跟随用户指尖实现实时流体波动效果,既趣味又解压。

HMSCore1阅读 2.1k

git patch常用方法
针对指定的commit range生成patch,默认对每一个commit分别单独生成patch文件。patch文件按照commit的先后顺序从1开始编号。patch文件会生成到当前目录下。

黑暗森林1阅读 13.2k评论 1

解读权威文档,编写易懂文章。如有恰好解答您的疑问,多谢赞赏支持~

405 声望
326 粉丝
宣传栏