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"
yexport 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 ejecutegit 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 (?)