Estoy trabajando con un repositorio con una gran cantidad de archivos que demora horas en pagar. Estoy investigando la posibilidad de que Git funcione bien con este tipo de repositorio ahora que admite pagos escasos, pero cada ejemplo que puedo encontrar hace lo siguiente:
git clone <path>
git config core.sparsecheckout true
echo <dir> > .git/info/sparse-checkout
git read-tree -m -u HEAD
El problema con esta secuencia de comandos es que el clon original también realiza un pago. Si agrega -n al comando de clonación original, el comando read-tree produce el siguiente error:
error: el pago escaso no deja ninguna entrada en el directorio de trabajo
¿Cómo puede hacer el pago escaso sin revisar primero todos los archivos?
git worktree add --no-checkout
también funcionará (no sologit clone --no-checkout
) con git 2.9 (solo 2016). Vea mi respuesta a continuaciónRespuestas:
En 2020 hay una forma más sencilla de lidiar con el pago escaso sin tener que preocuparse por los archivos .git. Así es como lo hice:
Tenga en cuenta que requiere la versión 2.25 de git instalada. Lea más sobre esto aquí: https://github.blog/2020-01-17-bring-your-monorepo-down-to-size-with-sparse-checkout/
ACTUALIZAR:
El
git clone
comando anterior seguirá clonando el repositorio con su historial completo, aunque sin retirar los archivos. Si no necesita el historial completo, puede agregar el parámetro --depth al comando, así:fuente
sparse-checkout --cone
función en stackoverflow.com/a/59515426/6309--filter
) a su respuesta aquí.--depth
parámetro que nos permite hacer un clon superficial. ¿Eso ayudará? @Tao, no estoy seguro de cómo usarlo--filter
en este caso, no lo intenté. ¿Podría dar un ejemplo o publicar otra respuesta a este tema?Tenga en cuenta que esta respuesta descarga una copia completa de los datos de un repositorio. El
git remote add -f
comando clonará todo el repositorio. De la página del manual degit-remote
:Prueba esto:
Ahora encontrará que tiene un pago "podado" con solo archivos de la ruta / inside_repo / to / desired_subdir presentes (y en esa ruta).
Tenga en cuenta que en la línea de comandos de Windows no debe citar la ruta, es decir, debe cambiar el sexto comando con este:
si no lo hace, obtendrá las cotizaciones en el archivo de pago escaso, y no funcionará
fuente
git remote add
comando descarga todo porque eso es lo que-f
hace: le dice que busque inmediatamente, antes de que haya definido las opciones de pago escaso. Pero omitir o reordenar eso no va a ayudar. Los pagos escasos solo afectan al árbol de trabajo, no al repositorio. Si desea que su repositorio siga una dieta, entonces debe mirar las opciones--depth
o en su--single-branch
lugar.Git Clone tiene una opción (
--no-checkout
o-n
) que hace lo que quieres.En su lista de comandos, simplemente cambie:
A esto:
A continuación, puede usar el pago escaso como se indica en la pregunta.
fuente
--depth <depth>
opción en git clone. Eso solo descargará los últimos<depth>
commits del historial. Actualmente no hay forma de descargar parcialmente un solo commit con git, aunque si su control remoto lo admite, puede usarlogit archive --remote
para descargar conjuntos parciales de archivos.Tuve un caso de uso similar, excepto que quería verificar solo el commit para una etiqueta y podar los directorios. El uso lo
--depth 1
hace muy escaso y realmente puede acelerar las cosas.fuente
Encontré la respuesta que estaba buscando en el one-liner publicado anteriormente por pavek (¡gracias!), Así que quería proporcionar una respuesta completa en una sola respuesta que funcione en Linux (GIT 1.7.1):
Cambié un poco el orden de los comandos, pero eso no parece tener ningún impacto. La clave es la presencia de la barra diagonal "/" al final de la ruta en el paso 5.
fuente
Lamentablemente, nada de lo anterior funcionó para mí, así que pasé mucho tiempo probando diferentes combinaciones de
sparse-checkout
archivos.En mi caso, quería omitir carpetas con configuraciones IntelliJ IDEA.
Aquí esta lo que hice:
correr
git clone https://github.com/myaccount/myrepo.git --no-checkout
correr
git config core.sparsecheckout true
Creado
.git\info\sparse-checkout
con el siguiente contenidoEjecute 'git checkout -' para obtener todos los archivos.
Lo crítico para hacerlo funcionar fue agregar
/*
después del nombre de la carpeta.Tengo git 1.9
fuente
Sí, es posible descargar una carpeta en lugar de descargar todo el repositorio. Incluso cualquier / último compromiso
Buena manera de hacer esto
-r HEAD solo descargará la última revisión, ignorará todo el historial.
Nota troncal y / carpeta específica
Copie y cambie la URL antes y después
/trunk/
. Espero que esto ayude a alguien. Disfruta :)Actualizado el 26 sep 2019
fuente
Respuesta actualizada 2020:
Ahora hay un comando
git sparse-checkout
que presento en detalle con Git 2.25 (Q1 2020)La respuesta de nicono ilustra su uso:
Ha evolucionado con Git 2.27 y sabe cómo "volver a aplicar" un pago escaso, como aquí .
Tenga en cuenta que con Git 2.28,
git status
mencionará que está en un repositorio escaso y desprotegidoRespuesta original: 2016
git 2.9 (junio de 2016) generalizará la
--no-checkout
opción degit worktree add
(el comando que permite trabajar con múltiples árboles de trabajo para un repositorio )Ver commit ef2a0ac (29 de marzo de 2016) por Ray Zhang (
OneRaynyDay
) .Ayudado por: Eric Sunshine (
sunshineco
) y Junio C Hamano (gitster
) .(Fusionada por Junio C Hamano -
gitster
- en commit 0d8683c , 13 abr 2016)La
git worktree
página del manual ahora incluye:fuente
Pasos para escanear solo la carpeta específica:
fuente
En base a esta respuesta de apenwarr y este comentario de Miral, se me ocurrió la siguiente solución que me ahorró casi el 94% del espacio en disco al clonar el repositorio de Linux git localmente mientras solo quería un subdirectorio de documentación:
Así que bajé de 2.9GB a 182MB, que ya es bastante agradable.
I, aunque no llegué a este trabajo con
git clone --depth 1 --no-checkout --filter=blob:none file:///…/linux linux-sparse-test
( insinuado aquí ) ya que entonces los archivos que faltan se añaden como todos los archivos eliminados en el índice. Entonces, si alguien sabe el equivalente degit clone --filter=blob:none
forgit fetch
, probablemente podamos ahorrar más megabytes. (Leer la página del manualgit-rev-list
también sugiere que hay algo así--filter=sparse:path=…
, pero tampoco conseguí que eso funcionara.(Todos intentaron con git 2.20.1 de Debian Buster).
fuente
--filter=sparse:path=…
.Soy nuevo en git, pero parece que si hago el pago de git para cada directorio, entonces funciona. Además, el archivo de pago disperso debe tener una barra inclinada final después de cada directorio como se indica. Alguien con más experiencia confirma que esto funcionará.
Curiosamente, si desprotege un directorio que no está en el archivo de desagüe escaso, parece que no hay diferencia. No se muestran en estado git y git read-tree -m -u HEAD no hace que se elimine. git reset --hard tampoco hace que se elimine el directorio. ¿Alguien más experimentado se preocupa por comentar qué piensa git de los directorios que están desprotegidos pero que no están en el escaso archivo de pago?
fuente
En git 2.27, parece que git sparse checkout ha evolucionado. La solución en esta respuesta no funciona exactamente de la misma manera (en comparación con git 2.25)
Estos comandos funcionaron mejor:
Ver también: git-clone --sparse y git-sparse-checkout add
fuente
En mi caso, quiero omitir la
Pods
carpeta al clonar el proyecto. Lo hice paso a paso como a continuación y funciona para mí. Espero eso ayude.Memo, si desea omitir más carpetas, simplemente agregue más líneas en el archivo de pago escaso.
fuente