Explicación detallada del repositorio
- usos de repositorios
- 1. Introducción al repositorio
- 2. Comandos comunes de repositorio
- 2.1 repo init (descargar repo y manifiesto de clonación)
- 2.2 sincronización de repositorio (código de descarga)
- 2.3 inicio de repositorio (crear y cambiar sucursales)
- 2.4 Pago de repositorio (cambiar de rama)
- 2.5 sucursales de reporto (ver sucursal)
- 2.6 repo diff (ver las diferencias de archivo del espacio de trabajo)
- Etapa de repositorio 2.7 (agregar archivos a la tabla de índice)
- 2.8 repo prune (eliminar ramas fusionadas)
- 2.9 abandono del repositorio (eliminar la rama especificada)
- 2.10 estado del repositorio (ver estado del archivo)
- 2.11 repo remoto (establecer almacén remoto)
- 2.12 impulso de repositorio
- 2.13 repositorio para todos
- 3. Conjunto de comandos adicionales para repositorio
- 4. Comando remoto agregado
- 5. Agregar comando de inserción
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 remotagit 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"