Explicación detallada del repositorio

Explicación detallada del repositorio


1. Introducción al repositorio

Android usa Git como herramienta de administración de código y desarrolló Gerrit para la revisión de código a fin de administrar mejor el código de manera centralizada. También desarrolló la herramienta de línea de comandos Repo , que encapsula algunos comandos de Git y organiza de manera efectiva más de 100 repositorios de Git .

1.1 Introducción al archivo de biblioteca de manifiestos

Un repositorio de manifiesto puede contener varios archivos de manifiesto y varias ramas, y cada archivo de manifiesto y rama tiene una versión correspondiente. Los archivos de manifiesto están organizados en formato xml. Por ejemplo:

  • El elemento remoto define un repositorio remoto llamado korg cuya dirección base es git://172.16.1.31/.
  • El elemento predeterminado establece el repositorio remoto predeterminado para cada proyecto en korg, y la rama predeterminada es gingerbread-exdroid-stable. Por supuesto, cada proyecto (elemento de proyecto) también puede definir su propio control remoto y revisión para anular la configuración predeterminada.
  • El elemento de proyecto se utiliza para definir un proyecto, el atributo de ruta indica la ubicación del clon en el espacio de trabajo y el atributo de nombre indica la ruta relativa del repositorio remoto del proyecto.
  • El archivo de copia del subelemento del elemento del proyecto define una acción de archivo adjunto después de clonar el proyecto, copiando el archivo de src a dest.

1.2 Descargar código de repositorio

$mkdir android2.3.4
$cd android2.3.4
$git clone git://172.16.1.31/repo.git

Entonces, hay una carpeta de repo en el directorio de Android, que contiene el código fuente de repo, y hay un script de repo en él, que se usa para ejecutar el comando repo.

Los usuarios que desarrollan localmente necesitan descargar el código de repositorio, y los usuarios que desarrollan en el servidor 172.16.1.7 no necesitan descargar el código de repositorio, porque el script de repositorio se ha agregado a la variable de entorno, y el reinicio de repositorio también descargará el código de repositorio.


2. Comandos comunes de repositorio

Observaciones: "*" indica un comando recién agregado

2.1 repo init (descargar repo y manifiesto de clonación)

Uso:

repo init –u URL [OPTIONS]

Opciones:

  • -u: especifica una URL que se conecta a un repositorio de muchos.
  • -m: seleccione un archivo xml en el repositorio de manifiesto.
  • -b: selecciona una rama en particular en un repositorio más múltiple.

El comando repo init debe completar las siguientes operaciones:

  • Complete la descarga completa de la herramienta de repositorio, el script de repositorio ejecutado es solo el cargador de arranque
  • Clonar la biblioteca de manifiesto manifest.git (la dirección proviene del parámetro -u)
  • El repositorio de manifiesto clonado está en manifest.git, clonado localmente en .repo/manifests. El manifest.repo/manifest.xml es solo un enlace simbólico, que apunta a .repo/manifests/default.xml
  • Si hay varios archivos xml en los manifiestos, repo init puede elegir uno de ellos arbitrariamente y la opción predeterminada es default.xml

Ejemplo:

repo init  -u git://172.16.1.31/manifest.git

La carpeta .repo aparece en el directorio android2.3.4

repo  init  -u git://172.16.1.31/manifest.git –m android.xml

Se selecciona la configuración en android.xml y .repo/manifest.xml apunta a .repo/manifests/android.xml.

2.2 sincronización de repositorio (código de descarga)

Uso:

repo sync [<project>]

Se utiliza para clonar y sincronizar el repositorio con referencia al archivo de manifiesto .repo/manifest.xml. Si aún no existe un repositorio del proyecto, ejecutar el comando repo sync es equivalente a ejecutar git clone Si el repositorio del proyecto ya existe, es equivalente a ejecutar las siguientes dos instrucciones:

  • La actualización remota de git
    es equivalente a realizar una operación de búsqueda en cada fuente remota

  • git rebase origin/branch
    realiza una operación de rebase contra la rama de seguimiento de la rama actual.

Ejemplo:

repo sync

También hay una opción para clonar uno de los proyectos:

repo sync platform/build

2.3 inicio de repositorio (crear y cambiar sucursales)

Uso:

repo start  <newbranchname> [--all | <project>]

El código recién clonado no tiene ramas, y el inicio del repositorio es en realidad la encapsulación del comando git checkout –b. Para el proyecto especificado o para todos los proyectos (si se usa el parámetro --all), cree una rama de características usando la rama especificada en el archivo de manifiesto. Esta instrucción es bastante diferente de git checkout –b.git checkout –b crea una rama de función basada en la rama actual, mientras que repo start crea una rama de función basada en la rama establecida en el archivo de manifiesto.

Ejemplo:

repo start  stable  --all

Suponiendo que la rama configurada en el archivo de manifiesto es gingerbread-exdroid-stable, ejecutar el comando anterior es crear una rama de características estable sobre la base de gingerbread-exdroid-stable para todos los proyectos.

repo start  stable  platform/build platform/bionic

Suponiendo que la rama configurada en el archivo de manifiesto es gingerbread-exdroid-stable, ejecutar el comando anterior es crear la rama de características estable sobre la base de gingerbread-exdroid-stable para los proyectos de plataforma/construcción y plataforma/bionic.

2.4 Pago de repositorio (cambiar de rama)

Uso:

repo checkout <branchname>  [<project>]

En realidad, es una encapsulación del comando git checkout, pero no puede tomar el parámetro -b, por lo que este comando no se puede usar para crear una rama de funciones.

Ejemplo:

repo checkout crane-dev 
repo checkout crane-dev  platform/build  platform/bionic

2.5 sucursales de reporto (ver sucursal)

Uso:

repo branches [<project>]

Ejemplo:

repo branches 
repo branches platform/build platform/bionic

2.6 repo diff (ver las diferencias de archivo del espacio de trabajo)

Uso:

repo diff [<project>]

De hecho, es la encapsulación del comando git diff, que se utiliza para mostrar las diferencias de archivos en el espacio de trabajo de cada proyecto.

Ejemplo:

repo diff                                 ---查看所有项目
repo diff platform/build platform/bionic  ---只查看其中两个项目

Etapa de repositorio 2.7 (agregar archivos a la tabla de índice)

De hecho, es una encapsulación del comando git add –interactive, que se utiliza para seleccionar cambios en el espacio de trabajo de cada proyecto para agregar al área de almacenamiento temporal.

Uso:

repo stage -i [<project>]

-i significa –interactive en el comando git add –interactive, dando una interfaz para que el usuario elija.

2.8 repo prune (eliminar ramas fusionadas)

De hecho, es una encapsulación del comando git branch –d, que se utiliza para escanear las diversas ramas del proyecto y eliminar las ramas fusionadas. El uso es el siguiente:

repo prune [<project>]

2.9 abandono del repositorio (eliminar la rama especificada)

De hecho, es una encapsulación del comando git branch –D, y su uso es el siguiente:

repo abandon <branchname> [<project>]

2.10 estado del repositorio (ver estado del archivo)

De hecho, es una encapsulación de los comandos git diff-index y git diff-filse, y muestra simultáneamente el estado del área de almacenamiento temporal y el estado de las modificaciones del archivo local.

$repo/repo status platform/bionic

El repositorio utiliza
el resultado de ejemplo anterior para mostrar el estado de modificación de la rama del proyecto plataforma/bionic

  • La primera línea de cada subsección muestra el nombre de la envidia y el nombre de la rama en la que se encuentra.
  • La primera letra indica el estado de modificación del archivo del área de almacenamiento temporal
    • -:Ningún cambio
    • A: Agregar (no en HEAD, en el área de almacenamiento temporal)
    • M: Modificar (en HEAD, en el área de ensayo, el contenido es diferente)
    • D: Eliminar (en HEAD, no en el área de almacenamiento temporal)
    • R: cambiar el nombre (no en HEAD, en el área de preparación, modificación de ruta)
    • C: copia (no en HEAD, en el área de almacenamiento temporal, copia de otros archivos)
    • T: El estado del archivo ha cambiado (en HEAD, en el área de preparación, el contenido es el mismo)
    • U: No fusionado, requiere resolución de conflictos
  • La segunda letra indica el estado modificado del archivo del espacio de trabajo.
    • -: nuevo/desconocido (no en el área de preparación, sino en el área de trabajo)
    • m: modificar (en el área de almacenamiento temporal, en el área de trabajo, modificado)
    • d: Eliminar (en el área de almacenamiento temporal, no en el área de trabajo)
  • Después de las dos letras que indican el estado, se muestra la información del nombre del archivo. Si hay un archivo con el mismo nombre, también mostrará el nombre del archivo antes y después del cambio y la similitud del archivo.

2.11 repo remoto (establecer almacén remoto)

Uso:

repo remote add <remotename>  <url> [<project>] 
repo remote rm <remotename>  [<project>]

Ejemplo:

repo remote add org ssh://172.16.1.31/git_repo

Esta instrucción es una rama remota agregada de acuerdo con el archivo xml, que es conveniente para enviar código al servidor. Después de la ejecución, puede ver la nueva organización de rama remota en el directorio de compilación:

Repo utiliza para eliminar el almacén remoto:

$repo  remote  rm  org

2.12 impulso de repositorio

repo push org

Esta es una instrucción recién agregada para enviar código al servidor, usando el método:

repo push <remotename> [--all |<project>]

Repo consultará los elementos que deben enviarse al servidor y le indicará al usuario.

2.13 repositorio para todos

Uso:

repo forall [<project>] –c <command>

Iterador, puede ejecutar el mismo comando de shell en todos los proyectos especificados

Opciones:
- -c: los siguientes parámetros son comandos de shell
- -p: lista el nombre del proyecto antes de la salida del comando de shell
- -v: lista la salida de información de error al ejecutar el comando de shell
variables de entorno adicionales:
- REPO_PROJECT: especifica el proyecto -
REPO_PATH: Especifique la ruta relativa del proyecto en el espacio de trabajo
- REPO_REMOTE: Especifique el nombre del almacén remoto del proyecto
- REPO_LREV: Especifique el valor hash correspondiente al último envío del proyecto al almacén del servidor
- REPO_RREV: Especifique la rama especificada del proyecto al clonar, manifiesto El atributo de revisión en

Además, si existen las variables de entorno anteriores en el comando de shell después de -c, debe encerrar el comando de shell entre comillas simples.

2.13.1 Variables de entorno añadidas

repo forall –c ‘echo $REPO_PROJECT’
repo forall  –c ‘echo $REPO_PATH
 
 
  
  

    2.13.2 fusionar (fusionar varias sucursales)

    Cambie todos los proyectos a la rama principal y ejecute las siguientes instrucciones para fusionar la rama temática en la rama principal

    repo forall –p –c git merge topic
    

    2.13.3 etiqueta (etiquetado)

    Etiquetar todos los proyectos

    repo forall –c git tag crane-stable-1.6
    

    2.13.4 remoto (establecer almacén remoto)

    Haga referencia a la variable de entorno REPO_PROJECT para agregar un almacén remoto:

    repo forall –c ‘git remote add korg sh://[email protected]/$REPO_PROJECT.git’
    

    Eliminar el repositorio remoto:

    repo forall –c git remote add korg
    

    2.13.5 rama (crear una rama característica)

    repo forall –c git branch crane-dev
    repo forall –c git checkout –b crane-dev
    

    3. Conjunto de comandos adicionales para repositorio

    3.1 repositorio grep

    Equivalente a la encapsulación de git grep, utilizada para buscar contenido en archivos de proyecto

    3.2 manifiesto de repositorio


    Mostrar el contenido del archivo de manifiesto

    repo manifest –o android.xml
    

    Versión de repositorio 3.3

    Mostrar el número de versión del repositorio

    Carga de repositorio 3.4

    cargar repo es equivalente a git push, pero hay grandes diferencias. No envía los cambios de la biblioteca de versiones al servidor remoto durante la clonación, sino que los envía a la referencia especial del servidor de revisión de código (configuración del software Gerrit), utilizando el protocolo SSH. El servidor de revisión de código realizará un procesamiento especial en el envío enviado, mostrará el nuevo envío como un conjunto de modificaciones para ser revisado e ingresará al proceso de revisión de código. Solo después de que se apruebe la revisión, se fusionará con el repositorio oficial.

    Dado que Allwinner no tiene un servidor de revisión de código, este comando no se puede usar.

    Uso:

    repo upload [--re --cc] {
        
        [<project>]| --replace <project>}
    

    Opciones:

    • -h, --help: muestra información de ayuda
    • -t: envía el nombre de la sucursal local al servidor de revisión de código Gerrit
    • --replace: envía un conjunto de parches actualizado para esta rama
    • –re=REVISORES: pide a las personas especificadas que revisen
    • –cc=CC: Enviar notificaciones a las siguientes direcciones de correo electrónico al mismo tiempo

    Descarga de repositorio 3.5

    Lo utilizan principalmente los revisores de código para descargar y evaluar las revisiones enviadas por los colaboradores
    .

    repo download {
        
        project change [patchset]}

    3.6 actualización automática del repositorio

    Para la actualización del propio repositorio
    Referencia: http://wenku.baidu.com/view/672c8faddd3383c4bb4cd257.html


    4. Comando remoto agregado

    Agregue remote.py en sumcmds, el procedimiento es el siguiente:

    # Copyright (C) 2009 The Android Open Source Project
    #
    # Licensed under the Apache License, Version 2.0 (the "License");
    # you may not use this file except in compliance with the License.
    # You may obtain a copy of the License at
    #
    #      http://www.apache.org/licenses/LICENSE-2.0
    #
    # Unless required by applicable law or agreed to in writing, software
    # distributed under the License is distributed on an "AS IS" BASIS,
    # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    # See the License for the specific language governing permissions and
    # limitations under the License.
    
    import sys
    from color import Coloring
    from command import Command
    from progress import Progress
    
    class Remote(Command):
      common = True
      helpSummary = "View current topic branches"
      helpUsage = """
           %prog add <remotebranchname> <url> [<project>...]
           %prog rm  <remotebranchname> [<project>...]
           --------------
                  """
      def str_last(self ,string):
         for c in string:
             last=c
         return last
    
      def Execute(self, opt, args):
        if not args:
          print >>sys.stderr, "error:..........wrong command........"
          print >>sys.stderr, "Usage:repo remote add <remotebranchname> <url> [<project>...]"
          print >>sys.stderr, "      repo remote rm  <remotebranchname> [<project>...] "          
          print >>sys.stderr, "................................"
          return
    
        err = []
        operate=args[0]
        #url = args[2]
        #branch_name=args[1]
        if operate == "rm":
           if not len(args) >=2:
             print >>sys.stderr, "error:miss remotebrancname"
             return
    
           branch_name=args[1]
           projects = args[2:]
        elif operate == "add":
           if not len(args) >=3:
             print >>sys.stderr, "error:miss remotebranchname or url"
             return
    
           branch_name=args[1]
           projects = args[3:]
        else:
           print >>sys.stderr, "error: the operand is add or rm "
           return
    
        all = self.GetProjects(projects)
        #print >>sys.stderr, all
        pm = Progress('remote %s' % operate, len(all))
        for project in all:
           if operate == "add":
              if self.str_last(args[2])=="/":
                 url = args[2]+project.name+'.git'
              else :
                 url = args[2]+'/'+project.name+'.git'
           else:
             url = ""
    
           pm.update() 
           if not project.Remote(operate,branch_name,url):
             err.append(project)
        pm.end()
    
        if err:
          if len(err) == len(all):
            print >>sys.stderr, 'error: no project remote  %s %s' % (operate,branch_name)  
          else:
            for p in err:
              print >>sys.stderr,\
                "error: %s/: cannot remote %s %s " \
                % (p.relpath, operate,branch_name)
          sys.exit(1)
    
    在preject.py中添加Remote(operate,branch_name,url)方法:
       def Remote(self,operate,branch_name,url):
         """Prune  topic branches already merged into upstream.
         """
         if url=="":   #rm
           return GitCommand(self,
                             ['remote', operate, branch_name],
                             capture_stdout = True,
    capture_stderr = True).Wait() == 0
    
         else:  #add
           return GitCommand(self,
                             ['remote', operate, branch_name,url],
                             capture_stdout = True,
                             capture_stderr = True).Wait() == 0
    

    5. Agregar comando de inserción

    Agregue push.py en subcmds, el código es el siguiente:

    #
    # Copyright (C) 2010 [email protected]
    #
    # Licensed under the Apache License, Version 2.0 (the "License");
    # you may not use this file except in compliance with the License.
    # You may obtain a copy of the License at
    #
    #      http://www.apache.org/licenses/LICENSE-2.0
    #
    # Unless required by applicable law or agreed to in writing, software
    # distributed under the License is distributed on an "AS IS" BASIS,
    # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    # See the License for the specific language governing permissions and
    # limitations under the License.
    
    import copy
    import re
    import sys
    from command import InteractiveCommand
    from editor import Editor
    from error import UploadError, GitError
    from project import ReviewableBranch
    
    def _ConfirmManyUploads(multiple_branches=False):
      if multiple_branches:
        print "ATTENTION: One or more branches has an unusually high number of commits."
      else:
        print "ATTENTION: You are uploading an unusually high number of commits."
      print "YOU PROBABLY DO NOT MEAN TO DO THIS. (Did you rebase across branches?)"
      answer = raw_input("If you are sure you intend to do this, type 'yes': ").strip()
      return answer == "yes"
    
    def _die(fmt, *args):
      msg = fmt % args
      print >>sys.stderr, 'error: %s' % msg
      sys.exit(1)
    
    def _SplitEmails(values):
      result = []
      for str in values:
        result.extend([s.strip() for s in str.split(',')])
      return result
    
    class Push(InteractiveCommand):
      common = True
      helpSummary = "Upload changes for code review"
    

    Supongo que te gusta

    Origin blog.csdn.net/qq_31939617/article/details/130930008
    Recomendado
    Clasificación