tag drop delete create git mercurial

drop - git tag atlassian



Clon parcial con Git y Mercurial (6)

¿Es posible clonar solo una rama (o de un compromiso dado) en Git y Mercurial? Quiero decir, quiero clonar un repositorio central pero, como es enorme, me gustaría obtener solo una parte y poder contribuir con mis cambios. ¿Es posible? Al igual, solo quiero desde Tag 130 en adelante o algo así?

¿Si es así, cómo?


Con respecto a Git podría ser de importancia histórica que Linus Torvalds respondiera esta pregunta desde la perspectiva conceptual en 2007 en una charla que se grabó y está disponible en línea.

La pregunta es si es posible verificar solo algunos archivos de un repositorio de Git.

Charla técnica: Linus Torvalds en git t = 43: 10

Para resumir, dijo que una de las decisiones de diseño de Git que lo diferencia de otros sistemas de gestión de fuentes (cita BitKeeper y SVN) es que Git gestiona el contenido, no los archivos. Las implicaciones son que, por ejemplo, una diferencia de un subconjunto de archivos en dos revisiones se calcula tomando primero la diferencia completa y luego limitándola solo a los archivos que se solicitaron. Otra es que debes verificar toda la historia; de una manera todo o nada. Por esta razón, sugiere dividir componentes poco relacionados entre múltiples repositorios y menciona un esfuerzo en curso para implementar una interfaz de usuario para administrar un repositorio que está estructurado como un superproyecto que contiene repositorios más pequeños.

Por lo que sé, esta decisión de diseño fundamental todavía manzanas hoy. El súper proyecto probablemente se convirtió en lo que ahora son submodules .


En la tierra de Git estás hablando de tres tipos diferentes de clones parciales:

  • clones poco profundos: quiero el historial desde el punto de revisión X en adelante.

    Utilice git clone --depth <n> <url> para eso, pero recuerde que los clones poco profundos tienen cierta limitación para interactuar con otros repositorios. Podrías generar parches y enviarlos por correo electrónico.

  • clon parcial por ruta de archivo: quiero todo el historial de revisión en algún directorio /path .

    No es posible en Git. Con el Git moderno, sin embargo, puedes tener un checkout escaso , es decir, tienes todo el historial, pero sacas (tienes en el área de trabajo) solo un subconjunto de todos los archivos.

  • clonación solo de la rama seleccionada: quiero clonar solo una rama (o un subconjunto de ramas seleccionado).

    Posible, y

    antes de git 1.7.10 no es simple: tendrías que hacer lo que el clon hace manualmente, es decir, git init [<directory>] , luego git remote add origin <url> , editar .git/config reemplazando * en remote.origin.fetch por rama solicitada (probablemente ''master''), luego git fetch .

    a partir de git 1.7.10 git clone ofrece la opción --single-branch que parece que se agregó solo para este propósito, y parece bastante fácil.

    Sin embargo, tenga en cuenta que debido a que las sucursales generalmente comparten la mayor parte de su historial, la ganancia de clonar solo un subconjunto de ramas podría ser menor de lo que cree.

También puede hacer un clon superficial de solo un subconjunto de ramas seleccionado.

Si sabe cómo las personas querrán dividir las cosas por el formato de archivo (proyectos múltiples en el mismo repositorio), puede usar submódulos (tipo svn: externos) para dividir previamente el repositorio en porciones clonables por separado.


En mercurial, deberías ser capaz de algo de esto usando:

hg convert --banchmap FILE SOURCEDEST REVMAP

También puede querer:

--config convert.hg.startrev=REV

La fuente puede ser git, mercurial o una variedad de otros sistemas.

No lo he intentado, pero convertir es bastante rico.


En tierra mercurial estás hablando de tres tipos diferentes de clones parciales:

  • clones superficiales: quiero que el historial desde el punto de revisión X en adelante use la extensión remotefilelog
  • clones parciales por ruta de archivo: quiero todo el historial de revisión en directorio / ruta con la extensión experimental narrowhg o quiero que solo los archivos en directorio / ruta estén en mi directorio de trabajo con extensión experimental dispersa (enviado desde la versión 4.3, ver hg help sparse ).
  • clones parciales por rama: quiero todo el historial de revisiones en la rama Y: use clone -r

Si sabes cómo la gente querrá dividir las cosas por el camino del archivo (múltiples proyectos en el mismo repositorio (lástima de ti)) puedes usar subrepositorios (algo así como svn externals) para dividir previamente el repositorio en porciones clonables por separado.

Además, en cuanto a "tan grande me gustaría obtener solo una parte": realmente solo tienes que hacer eso una vez. Solo clonalo mientras almuerzas, y luego lo tienes para siempre. Posteriormente puede pull y obtener deltas de manera eficiente en el futuro. Y si quieres otro clon, clona tu primer clon. Dónde obtienes un clon no importa (y los clones locales no ocupan espacio adicional en el disco ya que son enlaces duros bajo las sábanas).


Este método crea un archivo no versionado sin subrepositorios:

hg clone -U ssh://machine//directory/path/to/repo/project projecttemp cd projecttemp hg archive -r tip ../project-no-subrepos

El código fuente no versionado sin subrepositoies está en el directorio project-no-subrepos


La respuesta seleccionada proporciona una buena visión general, pero carece de un ejemplo completo.

Minimice su huella de descarga y pago (a) , (b) :

git clone --no-checkout --depth 1 --single-branch --branch (name) (repo) (folder) cd (folder) git config core.sparseCheckout true echo "target/path/1" >>.git/info/sparse-checkout echo "target/path/2" >>.git/info/sparse-checkout git checkout

Periódicamente optimice su espacio de almacenamiento local (c) (opcional, use con cuidado):

git clean --dry-run # consider and tweak results then switch to --force git gc git repack -Ad git prune

Ver también: Cómo manejar grandes repositorios con git