ref:
要用 repo/manifest 來管理現有 一堆 projects。
只要 create 一個 git project,裡面就是 manifest 的 xml 檔。
其中要有一個 default.xml, repo 會用這個做 主要的 manifest.xml
repo init -u mymanifest
mymanifest 就是放 default.xml 的 project folder
舉例來說:
假設myrepo 專案有 proj1, proj2 兩個 git source
.
├── proj1
└── proj2
想要用 repo/manifest 來管理。
就create 一個 manifests,裡面有 default.xml,也要用 git 管理:
<?xml version="1.0" encoding="UTF-8"?>
<manifest>
<remote name="origin" fetch="./" />
<default revision="master" remote="origin" />
<project path='proj1' name='proj1' />
<project path='prij2' name='proj2' />
</manifest>
然後 myrepo 下有三個 git projects:
.
├── manifests
│ └── default.xml
├── proj1
└── proj2
這樣,在 local 端,就可以用 repo init 來 clone 整個 project
mkdir testrepo && cd testrepo
repo init -u ~/myrepo/manifests
downloading Repo source from https://gerrit.googlesource.com/git-repo
remote: Counting objects: 2, done
remote: Finding sources: 100% (12/12)
remote: Total 12 (delta 0), reused 12 (delta 0)
Unpacking objects: 100% (12/12), done.
Downloading manifest from /home/charles-chang/myrepo/manifests/
remote: Counting objects: 15, done.
remote: Compressing objects: 100% (10/10), done.
remote: Total 15 (delta 4), reused 0 (delta 0)
Your identity is: charles.chang <charles.chang@loyaltech.com>
If you want to change this, please re-run 'repo init' with --config-name
repo has been initialized in /home/charles-chang/testrepo
之後 repo sync 就會拉下所有的 project (不包含 manifest,manifest 會在 .repo/manifests)
然後一樣在 repo init 時加上 --mirror 就可以產生 git server 端的目錄結構 (方便放在 git server)
現在看來,要先用
python script : follow repo/manifest.xml 做出 repo mirror 的結構.,重新安排一次 project 目錄結構。
之後才能讓人做 repo init, sync..
-- 新版的 repo 不從 manifest.xml parsing 了, manifest.xml 也不再是 link,而是一個 include name,include default.xml (或其他)。
repo 管理後,如果要create 一個版本, fix 住目前的 project revision,可以用
repo manifest, 如何導出並使用清單文件? 的方法。用 repo manifest,列出有家 option 和沒加 option 的結果:
一般:
charles-chang@rdsuper:~/testmirror$ repo manifest
<?xml version="1.0" encoding="UTF-8"?>
<manifest>
<remote fetch="./" name="origin"/>
<default remote="origin" revision="master"/>
<project name="pp/project1" path="project1"/>
<project name="project2" path="priject2"/>
</manifest>
加上 supress-upstream-revision
charles-chang@rdsuper:~/testmirror$ repo manifest -r --suppress-upstream-revision
<?xml version="1.0" encoding="UTF-8"?>
<manifest>
<remote fetch="./" name="origin"/>
<default remote="origin" revision="master"/>
<project dest-branch="master" name="pp/project1" path="project1" revision="7c4bcfb45cd9aa2266c0acf3f850a9ea50ae5ef9"/>
<project dest-branch="master" name="project2" path="priject2" revision="907de68553f9b6d638aceb967c7a9f55bc8fcb03"/>
</manifest>
舊可可以把這個列出的結果存成新的 myversion.xml,加到 manifests.git 中。
如果 project 在另一個 project 中...可以用 .gitignore..
例如:
.
├── priject2
│ └── pp2
└── project1
├── p3
│ └── myfile
└── pp1
p3 在 project1 裡。
manifest 是這樣:
<manifest>
<remote name="origin" fetch="./" />
<default revision="master" remote="origin" />
<project path='project1' name='pp/project1' />
<project path='priject2' name='project2' />
<project path='project1/p3' name='p3' />
</manifest>
可以看到 project path='project1/p3' 這樣。
但是這樣在 repo sync 後,project1 下 git status 就會看到 p3 new.
所以要加 .gitignore
p3
manifest 中,project 有些會有:
revision="36fb2aa4f7f25946e0ce3d4223095ce9601dd17f" upstream="cafe/QCLA.2.0-r00015.3"
這樣的話,project 要有 rev="36fb2aa4f7f25946e0ce3d4223095ce9601dd17f" 的 commit 存在,同時,還要有個branch nane叫 ""cafe/QCLA.2.0-r00015.3".
用 git ls-remote 可以列出 remote ref head. 可以檢查