una tag ramificacion rama presentación poner para how etiqueta especifica crear como comando clonar git

tag - git Clone superficial a etiqueta específica



pull de una rama git (5)

Quiero clonar el repositorio del kernel de Linux, pero solo a partir de la versión 3.0, ya que el repositorio del kernel es tan grande que hace que mis herramientas de control de versiones se ejecuten más rápido si puedo hacer un clon superficial. El núcleo de mi pregunta es: ¿cómo puedo decirle a git cuál es el valor "n" para el parámetro --depth? Esperaba que esto funcionara:

git clone http://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git --depth v3.0

Gracias.


¿Qué hay de clonar la etiqueta a una profundidad de 1?

  • git clone --branch mytag0.1 --depth 1 https://example.com/my/repo.git

Notas:

  • --depth 1 implica --single-branch , por lo que no se trae información de otras sucursales al repositorio clonado
  • Si desea clonar un repositorio local, use file:// lugar de solo la ruta del repositorio

Desafortunadamente, el parámetro --depth de git clone acepta solo un número, el número de revisiones a las que se debe truncar el repositorio de clonación.

Una posible solución es clonar todo el repositorio y luego truncar su historial para mantener solo los confirmaciones después de v3.0. Aquí hay un buen http://bogdan.org.ua/2011/03/28/how-to-truncate-git-history-sample-script-included.html : http://bogdan.org.ua/2011/03/28/how-to-truncate-git-history-sample-script-included.html

git checkout --orphan temp v3.0 git commit -m "Truncated history" git rebase --onto temp v3.0 master git branch -D temp git gc


El parámetro --depth parece ser solo un número (el " número especificado de revisiones"), no una etiqueta.

Posible idea (para ser probado):

Sin embargo, puede utilizar git describe para obtener la etiqueta más reciente de su HEAD actual, así como el número de comillas entre dicha etiqueta y HEAD .
Si esa "etiqueta más reciente" no es su etiqueta, simplemente repita el proceso, comenzando por la confirmación a la que hace referencia esa etiqueta más reciente, hasta que encuentre su etiqueta ( v3.0 en su caso, por ejemplo).

La suma de todos esos números de confirmación le dará la profundidad para dar al comando git clone , siempre que su etiqueta sea accesible desde su HEAD actual.


Lea completamente para encontrar una solución, pero desafortunadamente, git clone no funciona de la manera que está solicitando. El parámetro --depth limita el número de revisions no el número de commits . No hay un parámetro de clon que limite la cantidad de confirmaciones. En su situación, incluso si supiera que solo había como máximo 10 diferencias de revisión del archivo que más ha cambiado entre v3.0 y el HEAD más nuevo en el repositorio y usado --depth 10 , todavía podría obtener el máximo --depth 10 historia de repo Debido a que algunos objetos pueden no tener hasta 10 revisiones, obtendrá su historial hasta el comienzo de su primera aparición en el repositorio.

Ahora aquí le explicamos cómo hacer lo que le gusta: la clave de su problema es que necesita las confirmaciones entre v3.0 y la referencia más reciente que desea. Aquí están los pasos que hice para hacer precisamente eso:

  • git clone http://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git --depth 10075 smaller_kernel_repo
  • cd smaller_kerenel_repo
  • Determine el sha de v3.0 git log --oneline v3.0^..v3.0
  • Cree un punto de injerto a partir de este sha (es 02f8c6aee8df3cdc935e9bdd4f2d020306035dbe)
  • echo "02f8c6aee8df3cdc935e9bdd4f2d020306035dbe" > .git/info/grafts
  • Para solucionar algunos problemas con algunas entradas de registro del kernel, haga lo siguiente: export GIT_AUTHOR_NAME="tmp" y export GIT_COMMITTER_NAME="tmp"

  • Hay una buena advertencia en la página de manual sobre el historial de reescritura de git filter-branch siguiendo los puntos de injerto ... así que abusemos de eso, ahora ejecute git filter-branch y siéntese y espere ... (y espere y espere)

Ahora necesitas limpiar todo:

git reflog expire --expire=now --all git repack -ad # Remove dangling objects from packfiles git prune # Remove dangling loose objects

Este proceso requiere mucho tiempo pero no es muy complejo. Esperemos que te ahorre todo el tiempo que esperabas a largo plazo. En este punto, tendrá un repositorio con un historial modificado de solo v3.0 en adelante desde el repositorio linux-stable.git. Al igual que si se usara el --depth on clone, tiene las mismas restricciones en el repositorio y solo podrá modificar y enviar parches del historial que ya tiene. Hay maneras de evitar eso ... pero merece sus propias preguntas y respuestas.

Yo mismo estoy en el proceso de probar los últimos pasos, pero la operación de git filter-branch continúa. Actualizaré esta publicación con cualquier problema, pero seguiré adelante y la publicaremos para que pueda comenzar este proceso si lo encuentra aceptable.

ACTUALIZAR

Solución para el problema (fatal: ident vacío <> no permitido). Este problema surge con un problema en el historial de confirmación del repositorio de Linux.

Cambia el comando git filter-branch a:

git filter-branch --commit-filter '' if [ "$GIT_AUTHOR_EMAIL" = "" ]; then GIT_AUTHOR_EMAIL="tmp@tmp"; GIT_AUTHOR_NAME=''tmp'' GIT_COMMITTER_NAME=''Me'' GIT_COMMITTER_EMAIL=''[email protected]'' git commit-tree "$@"; else git commit-tree "$@"; fi ''


Para alguien que ya tiene un clon, este comando obtendrá el número de confirmaciones entre la punta de la rama actual y la etiqueta 5.6 :

$ git rev-list HEAD ^5.6 --count 407

Encontré este proyecto implementando rev-list utilizando la API de GitHub: https://github.com/cjlarose/github-rev-list

La página de manual muy larga en rev-list indica que hay muchas cosas detrás de escena. Hay muchos caminos diferentes para posiblemente contar los compromisos con las ramas y las combinaciones que van y vienen. Para este caso de uso, aunque eso probablemente se puede ignorar (?)