2011-05-27 19 views
38

El Android source es un large hierarchy of git repositories. Se administran mediante un script personalizado llamado repo. Repo determina qué repositorios git gestionar utilizando un archivo manifest.xml. El manifest.xml of Android está alojado en un repositorio git junto con todos los demás repositorios git.¿Cómo funciona el repositorio de manifiesto de Android?

¿Cómo se gestiona este repositorio en Android? Específicamente, ¿cómo se organizan las diferentes ramas y los diferentes archivos alojados en cada rama?

Respuesta

6

En la raíz del repos es un directorio oculto llamado ".repo", dentro de usted encontrará un proyecto de git llamado "manifiestos" que generalmente contiene un archivo llamado "default.xml". Este archivo contiene información sobre todos los proyectos y dónde se encuentran sus repositorios git asociados. Este archivo también está versionado, por lo tanto, cuando utiliza el comando "repo init -b XYZ", se revertirá y podrá volver a ramas anteriores que pueden haber agregado/eliminado proyectos de git en comparación con el encabezado.

Aquí hay un enlace al documento de cesión temporal repositorio git describe el formato manifiesta:

https://gerrit.googlesource.com/git-repo/+/master/docs/manifest-format.txt

+0

enlace está roto. –

56

En primer lugar, init repo crea el directorio .repo, los clones del repositorio Git https://android.googlesource.com/tools/repo a .repo/repo, y el repositorio Git especificado con la opción -u en un repositorio vacío en .repo/manifests.git. Después de eso, crea el directorio .repo/manifests, lo convierte en un repositorio git mediante la creación de enlaces simbólicos desde .repo/manifests/.git hasta .repo/manifests.git. A continuación, verifica la rama especificada en -b y crea un enlace simbólico .repo/manifest.xml que apunta al archivo especificado (opción -m) en .repo/manifests, de forma predeterminada .repo/manifests/default.xml.

aproximadamente como sigue:

 
    repo init -u $URL -b $BRANCH -m $MANIFEST 
    -------------------- 
    mkdir .repo; cd .repo 
    git clone https://android.googlesource.com/tools/repo 
    git clone --bare $URL manifests.git 
    mkdir -p manifests/.git; cd manifests/.git 
    for i in ../../manifests.git/*; do ln -s $ı .; done 
    cd .. 
    git checkout $BRANCH -- . 
    cd .. 
    ln -s manifests/$MANIFEST manifest.xml 

se puede rastrear lo que realmente sucede con repo --trace init ...

Entonces, los repositorios de pase clones de sincronización a Git que .repo/projects para cada proyecto en manifest.xml y local_manifest.xml, crea los directorios de trabajo con .git tener enlaces simbólicos al repositorio desnudo correspondiente, verifica la rama especificada en el manifiesto y actualiza .repo/project.list. El caso donde los proyectos ya están allí es ligeramente diferente, esencialmente realizando un git pull --rebase.

+0

¡Me encantaría escuchar la explicación de por qué hacen las cosas de esta manera! En particular, ¿cuál es la ventaja de almacenar todos los contenidos '.git' dentro de' .repo/projects/'? – Hamy

+0

No tengo idea de por qué las personas detrás de 'repo' eligieron el enfoque que hicieron. Con algunas versiones de 'repo', era posible compartir el directorio' .repo/projects' entre diferentes árboles de compilación, lo que era útil en una computadora portátil con un disco duro pequeño.Pero eso nunca fue respaldado, y no estoy seguro si funciona más. –

+2

@Hamy: permite a uno controlar el directorio de construcción de un proyecto visible sin perder los objetos de git, por lo que una sincronización de repos será rápida. –

Cuestiones relacionadas