我正在尝试创建AOSP的新分支(在我的开发计算机上)并将其推送到本地镜像(在同一LAN上的服务器上)。我找不到解释如何执行此操作的“repo”工具的文档。
我使用以下命令在服务器上创建了AOSP源镜像:
$ mkdir -p ~/aosp/mirror
$ cd ~/aosp/mirror
$ repo init -u https://android.googlesource.com/mirror/manifest --mirror
然后我在另一台计算机上同步:
$ repo init -u <USERNAME>@<IP_OF_SERVER>:/home/<USERNAME>/aosp/mirror/platform/manifest.git -b android-4.2.2_1
$ repo sync
到目前为止一切顺利。我正在使用“-b android-4.2.2_1”因为我需要我的开发才能使用这个版本的JellyBean作为基线。
然后我使用“repo start”创建一个新的分支:
$ repo start my-branch-name --all
仍然很好。问题是,我无法弄清楚如何将此分支“推送”到远程服务器。
当我repo info
时,我看到了:
Manifest branch: refs/tags/android-4.2.2_r1
Manifest merge branch: android-4.2.2_r1
Manifest groups: all,-notdefault
----------------------------
Project: platform/abi/cpp
Mount path: /home/<username>/<project_name>/android/abi/cpp
Current revision: refs/tags/android-4.2.2_r1
Local Branches: 1 [my-branch-name]
---------------------------
....
当我尝试repo upload
时,我得到了:
no branches ready for upload
然后我尝试了repo forall -c "git push aosp my-branch-name"
将本地分支推送到每个远程存储库,但似乎这不是正确的方法。特别是,如果我尝试创建一个新客户端,并尝试同步到分支,它就不起作用。
$ repo init -u <USERNAME>@<IP_OF_SERVER>:/home/<USERNAME>/aosp/mirror/platform/manifest.git -b my-branch-name
error: revision my-branch-name in manifests not found
创建“Manifest分支”的正确方法是什么?
答案 0 :(得分:10)
repo start
命令根据当前上游分支创建本地分支。运行repo upload
将上载当前已检出分支上的任何本地提交以供审阅到清单文件中列出的Gerrit服务器托管的上游分支。如果您要执行的推送类型与此用例不匹配,则必须使用基础Git命令进行推送。你仍然可以使用repo start
(但你不必)。
要创建清单分支,repo start
和repo upload
无用。与Repo管理的其他gits不同,您应该对default
分支上的清单git进行所有更改,Repo会为您检查。然后,使用普通的Git命令来推送您的更改。
以下示例显示如何创建名为mybranch
的新清单分支,与当前上游相同。
cd .repo/manifests
git push origin default:refs/heads/mybranch
现在,这本身并不是很有用,因为你的清单的内容与上游分支相同 - 我们只是克隆了清单的那个分支,所以当你可以运行时
repo init -u ssh://git.example.com/platform/manifest -b mybranch
结果将与您开始时的结果相同:
repo init -u ssh://git.example.com/platform/manifest -b android-4.2.2_1
为了使您的镜像有用,您还必须分支清单中列出的每个git,以便在服务器上获得可以进行更改的分支。
从理论上讲,您可以对从上游下载的相同分支进行更改,但是当您下次尝试从上游进行同步时,这会造成混乱。不要那样做。
要在服务器上创建分支,您可以遵循与清单相同的模式:
cd build
git push ssh://git.example.com/platform/build HEAD:refs/heads/mybranch
请注意使用HEAD,即当前签出提交的符号名称。为每个git执行此操作非常繁琐,因此请使用repo forall
命令:
repo forall -c 'git push aosp HEAD:refs/heads/mybranch'
请注意,远程名称与清单git(IIRC)不同。
有关repo help forall
(repo forall
,REPO_PROJECT
和$REPO_LREV
运行的命令可用的环境变量列表,请参阅$REPO_RREV
。repo forall
可能是最有用的命令)。
很容易搞砸echo
,所以养成一个好习惯,首先用echo
添加命令,让运行的命令回显到你的终端。如果您对结果感到满意,请删除mybranch
以运行真实命令。
到现在为止,你所有的gits都会有一个repo init -u ssh://git.example.com/platform/manifest -b mybranch
分支,包括清单。剩下的就是更改清单以便
mybranch
实际上会检查所有gits中的cd .repo/manifests
vi default.xml
[ Change the default revision from refs/tags/android-4.2.2_1
or whatever it says to 'mybranch'. ]
git commit -a -m 'Changed default revision to mybranch.'
git push origin default:refs/heads/mybranch
。
mybranch
请注意,所有gits不一定使用默认修订版(您刚刚更改为{{1}})。对于android-4.2.2_1清单分支可能就是这种情况,但在其他情况下,某些gits不会使用默认修订版,而是使用自己的修订版属性覆盖它。这很好,但它需要你做出额外的明显改变。