error: .repo/manifests/: contains uncommitted changes
原因:在repo/manifests有被修改的文件,没有commit到仓库。可以通过git status查看。情况1、manifests文件夹中的文件是不小心修改的解决方法:1、cd 进入.repo/manifestscd .repo/manifests2、执行如下三条命令git stashgit clean -f -d3、重新开始同步reposync-c -j4 --no-clone-bundl
原因:在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_xml。Local 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:
Android Local Manifests机制的使用实践
android源码下local_manifest.xml初探 | qingliu's blog
repo sync error: .repo/manifests/: contains uncommitted changes - GoneWithWind - 博客园
更多推荐
所有评论(0)