原因:在repo/manifests有被修改的文件,没有commit到仓库。可以通过git status查看。

情况1、manifests文件夹中的文件是不小心修改的

解决方法:

1、cd 进入.repo/manifests

cd .repo/manifests

2、执行如下三条命令

git stash

git clean -f -d

3、重新开始同步

repo sync -c -j4 --no-clone-bundle

git clean命令用来从你的工作目录中删除所有没有tracked过的文件

情况2、如果我就是想修改manifest文件,但是又无法直接修改manifests文件夹中的

解决方法:

采用local_manifest机制,能够避免了直接修改default.xml,不会造成下次同步远程清单文件的冲突。

repo命令的执行依赖于解析清单文件的结果,解析时,就约定了在manifests/default.xml的基础上,融合local_manifest.xml文件和local_manifests/目录下的文件,生成一个的数据结构manifest_xmlLocal Manifests机制的原理图如下所示:

清单文件的解析由manifest_xml.py这个脚本负责;解析结果输出给其他命令,譬如repo sync。这里有一些隐含的规则:

  • 先解析local_manifest.xml,再解析local_manifests/目录下的清单文件;

  • local_manifests目录下的清单文件是没有命名限制的,但会按照字母序被解析,即字母序靠后的文件内容会覆盖之前的;

  • 所有清单文件的内容必须遵循repo定义的格式[3]才能被正确解析。

笔者实现了Local Manifests机制的一个使用示例:https://github.com/LocalManifestsDemo,这是一个包含多个git库的项目。 该项目中,默认的default.xml文件内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<manifest>
  <remote name="origin" fetch=".." />

  <default revision="refs/heads/master" remote="origin" />

  <project path="A" name="LocalManifestsDemo/project-A" />
  <project path="B" name="LocalManifestsDemo/project-B" />
</manifest>

default.xml中,配置了两个项目: A 和 B,每个项目对应到一个git库。 当执行完repo sync之后,本地的代码目录结构如下:

LocalManifestsDemo
├── A (master)
└── B (master)

利用Local Manifests机制,新增local_manifests/default_local.xml文件:

<?xml version="1.0" encoding="UTF-8"?>
<manifest>
  <remove-project name="LocalManifestsDemo/project-A" />
  <remove-project name="LocalManifestsDemo/project-B" />
  <project path="B" name="LocalManifestsDemo/project-B" revision="stable" />
  <project path="C" name="LocalManifestsDemo/project-C" />
</manifest>

local_manifests目录下的default_local.xml文件中,定义了:

  • 删除项目 A,通过<remove-project>标签可以删除项目
  • 将项目 B 指定为stable分支,通过先删除后新增的方式间接完成对 B 的修改
  • 新增项目 C

最终,融合的清单文件内容如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<manifest>
  <remote name="origin" fetch=".." />

  <default revision="refs/heads/master" remote="origin" />

  <project path="B" name="LocalManifestsDemo/project-B" revision="stable" />
  <project path="C" name="LocalManifestsDemo/project-C" />
</manifest>

执行完repo sync后,本地的代码目录结构如下所示:

LocalManifestsDemo
├── B (stable)
└── C (master)

可以看到, 项目 A 的代码目录被删除了,项目 B 被切换到了stable分支,新增了一个项目 C

note:

1、.repo/local_manifests 目录里面去(如果local_manifests目录不存在,使用mkdir -p .repo/local_manifests来创建)

2、添加了local_manifest文件后,如果同步出现fatal: duplicate path ....的错误,一般是新添加的local_manifests文件中的仓库和之前的仓库有重复,根据提示检查即可!

ref:

Repo介绍

Android Local Manifests机制的使用实践

android源码下local_manifest.xml初探 | qingliu's blog

repo sync error: .repo/manifests/: contains uncommitted changes - GoneWithWind - 博客园

Logo

瓜分20万奖金 获得内推名额 丰厚实物奖励 易参与易上手

更多推荐