Encontré una colección de slackbuilds, algunos de los que necesito están en GitHub. https://github.com/PhantomX/slackbuilds/ No quiero obtener todos los git.
git clone https://github.com/PhantomX/slackbuilds.git
Pero solo obtenga un slackbuild, para este .
¿Cómo hacer esto? ¿Es posible?
Comentarios
- stackoverflow.com/a/13738951/2072269
Responder
Terminarás descargando el historial completo, así que no veo mucho beneficio en él, pero puede pagar partes específicas usando un pago «escaso». Citando esta publicación de Stack Overflow :
Los pasos para hacer un escaso clone son los siguientes:
mkdir <repo> cd <repo> git init git remote add -f origin <url>
Esto crea un repositorio vacío con su control remoto, y recupera todos los objetos pero no los revisa. Luego hacer:
git config core.sparseCheckout true
Ahora debe definir qué archivos / carpetas desea verificar. Esto se hace enumerándolos en
.git/info/sparse-checkout
, por ejemplo:echo "some/dir/" >> .git/info/sparse-checkout echo "another/sub/tree" >> .git/info/sparse-checkout
Por último, pero no menos importante, actualice su repositorio vacío con el estado del control remoto:
git pull origin master
Es posible que desee echar un vistazo al tutorial extendido y probablemente debería leer la documentación oficial para el pago disperso .
Es mejor que utilice un clon superficial también. En lugar de git pull
comando dado anteriormente, intente:
git pull --depth=1 origin master
Comentarios
- Obtengo
error: Sparse checkout leaves no entry on working directory
después de hacer un git pull después de realizar la modificación encore.sparseCheckout
y.git/info/sparse-checkout
- Corrección:
git init; git remote ...
acaba de configurar las cosas, no se descarga nada. El objetivo de sparse es obtener solo los objetos que le interesan. - @vonbrand que ‘ es lo que
-f
es para: » Con la opción -f, git fetch < name > se ejecuta inmediatamente después de configurar la información remota. » - Después de
git remote add -f origin <url>
git todavía está descargando el repositorio completo . En mi caso, no ‘ no quiero perder tiempo esperando eso, incluso si no ‘ no verifica el repositorio completo. - En el pago disperso, definimos lo que queremos verificar, pero ¿hay alguna manera de excluir algunos directorios y verificar el resto?
Respuesta
git clone --filter
de git 2.19 ahora funciona en GitHub (probado 2020-09 -18, git 2.25.1)
Esta opción se agregó junto con una actualización del protocolo remoto, y realmente evita que los objetos se descarguen del servidor.
Por ejemplo, para clonar solo los objetos necesarios para d1
de este repositorio: https://github.com/cirosantilli/test-git-partial-clone Puedo hacer:
git clone \ --depth 1 \ --filter=blob:none \ --no-checkout \ https://github.com/cirosantilli/test-git-partial-clone \ ; cd test-git-partial-clone git checkout master -- d1
El comando de clonación solo obtiene:
- un solo objeto de confirmación con la punta de la
master
rama - los 4 objetos de árbol del repositorio:
- directorio de nivel superior de confirmación
- los tres directorios
d1
,d2
,master
Luego, el comando checkout
recupera solo los blobs (archivos) faltantes del servidor:
-
d1/a
-
d1/b
Aún mejor, más adelante GitHub probablemente comenzará a admitir:
--filter=blob:none \ --filter=tree:0 \
donde --filter=tree:0
de Git 2.20 evitará clone
innecesaria para recuperar todos los objetos del árbol y permitir que se difiera a checkout
. Pero en mi prueba 2020-09-18 que falla con:
fatal: invalid filter-spec "combine:blob:none+tree:0"
presumiblemente porque el --filter=combine:
filtro compuesto ( agregado en Git 2.24, implícito en varios --filter
) aún no está implementado.
Observé qué objetos se obtuvieron con:
git verify-pack -v .git/objects/pack/*.pack
como se menciona en: https://stackoverflow.com/questions/7348698/git-how-to-list-all-objects-in-the-database/18793029#18793029 No me da una indicación muy clara de qué es exactamente cada objeto, pero dice el tipo de cada objeto (commit
, tree
, blob
), y dado que hay tan pocos objetos en ese repositorio mínimo, puedo deducir sin ambigüedades lo que el objeto es.
git rev-list --objects --all
produjo una salida más clara con rutas para árboles / blobs, pero desafortunadamente recupera algunos objetos cuando lo ejecuto, lo que hace que sea difícil de determinar qué se obtuvo cuando, avíseme si alguien tiene un comando mejor.
TODO encuentre el anuncio de GitHub que dice cuándo comenzaron a admitirlo. https://github.blog/2020-01-17-bring-your-monorepo-down-to-size-with-sparse-checkout/ de 2020-01-17 ya menciona --filter blob:none
.
git sparse-checkout
I Creo que este comando está destinado a administrar un archivo de configuración que dice » Solo me preocupan estos subárboles » para que los comandos futuros solo afecten a esos subárboles. Pero es un poco difícil estar seguro porque la documentación actual es un poco … escasa 😉
No impide, por sí mismo, la búsqueda de blobs.
Si esta comprensión es correcta, entonces sería un buen complemento de git clone --filter
descrito anteriormente, ya que evitaría la recuperación involuntaria de más objetos si tiene la intención de realizar operaciones de git en el repositorio clonado parcial .
Cuando probé Git 2.25.1:
git clone \ --depth 1 \ --filter=blob:none \ --no-checkout \ https://github.com/cirosantilli/test-git-partial-clone \ ; cd test-git-partial-clone git sparse-checkout init
no funcionó porque el init
en realidad buscó todos los objetos.
Sin embargo, en Git 2.28 no buscó los objetos como se deseaba. Pero luego, si lo hago:
git sparse-checkout set d1
d1
no se busca y se comprueba, aunque esto lo dice explícitamente should: https://github.blog/2020-01-17-bring-your-monorepo-down-to-size-with-sparse-checkout/ # sparse-checkout-and-partial-clones Con descargo de responsabilidad:
Esté atento a que la función de clonación parcial esté disponible de forma generalizada [1].
[1]: GitHub todavía está evaluando esta función internamente mientras está habilitada en unos pocos repositorios seleccionados (incluido el ejemplo utilizado en esta publicación). A medida que la función se estabilice y madure, lo mantendremos actualizado con su progreso.
Así que sí, es demasiado difícil estar seguro en el momento, gracias en parte a las alegrías de que GitHub sea de código cerrado. Pero echemos un vistazo.
Desglose de comandos
El servidor debe configurarse con:
git config --local uploadpack.allowfilter 1 git config --local uploadpack.allowanysha1inwant 1
Desglose de comandos:
-
--filter=blob:none
omite todos los blobs, pero aún obtiene todos los objetos de árbol -
--filter=tree:0
omite los árboles innecesarios: https://www.spinics.net/lists/git/msg342006.html -
--depth 1
ya implica--single-branch
, ver también: https://stackoverflow.com/questions/1778088/how-to-clone-a-single-branch-in-git -
file://$(path)
es necesario para superar lasgit clone
travesuras del protocolo: https://stackoverflow.com/questions/47307578/how-to-shallow-clone-a-local-git-repository-with-a-relative-path -
--filter=combine:FILTER1+FILTER2
es la sintaxis para usar varios filtros en una vez, intentar pasar--filter
por alguna razón falla con: » múltiples especificaciones de filtro no se pueden combinar «. Esto se agregó en Git 2.24 en e987df5fe62b8b29be4cdcdeb3704681ada2b29e » list-objects-filter: implemente filtros compuestos »Editar: en Git 2.28, veo experimentalmente que
--filter=FILTER1 --filter FILTER2
también tiene el mismo efecto, ya que GitHub no implementacombine:
todavía a partir de 2020-09- 18 y se quejafatal: invalid filter-spec "combine:blob:none+tree:0"
. TODO introducido en qué versión?
El formato de --filter
está documentado en man git-rev-list
.
Documentos en el árbol de Git:
- https://github.com/git/git/blob/v2.19.0/Documentation/technical/partial-clone.txt
- https://github.com/git/git/blob/v2.19.0/Documentation/rev-list-options.txt#L720
- https://github.com/git/git/blob/v2.19.0/t/t5616-partial-clone.sh
Pruébelo localmente
La siguiente secuencia de comandos genera de forma reproducible https://github.com/cirosantilli/test-git-partial-clone repositorio local, hace un clon local y observa lo que se clonó:
#!/usr/bin/env bash set -eu list-objects() ( git rev-list --all --objects echo "master commit SHA: $(git log -1 --format="%H")" echo "mybranch commit SHA: $(git log -1 --format="%H")" git ls-tree master git ls-tree mybranch | grep mybranch git ls-tree master~ | grep root ) # Reproducibility. export GIT_COMMITTER_NAME="a" export GIT_COMMITTER_EMAIL="a" export GIT_AUTHOR_NAME="a" export GIT_AUTHOR_EMAIL="a" export GIT_COMMITTER_DATE="2000-01-01T00:00:00+0000" export GIT_AUTHOR_DATE="2000-01-01T00:00:00+0000" rm -rf server_repo local_repo mkdir server_repo cd server_repo # Create repo. git init --quiet git config --local uploadpack.allowfilter 1 git config --local uploadpack.allowanysha1inwant 1 # First commit. # Directories present in all branches. mkdir d1 d2 printf "d1/a" > ./d1/a printf "d1/b" > ./d1/b printf "d2/a" > ./d2/a printf "d2/b" > ./d2/b # Present only in root. mkdir "root" printf "root" > ./root/root git add . git commit -m "root" --quiet # Second commit only on master. git rm --quiet -r ./root mkdir "master" printf "master" > ./master/master git add . git commit -m "master commit" --quiet # Second commit only on mybranch. git checkout -b mybranch --quiet master~ git rm --quiet -r ./root mkdir "mybranch" printf "mybranch" > ./mybranch/mybranch git add . git commit -m "mybranch commit" --quiet echo "# List and identify all objects" list-objects echo # Restore master. git checkout --quiet master cd .. # Clone. Don"t checkout for now, only .git/ dir. git clone --depth 1 --quiet --no-checkout --filter=blob:none "file://$(pwd)/server_repo" local_repo cd local_repo # List missing objects from master. echo "# Missing objects after --no-checkout" git rev-list --all --quiet --objects --missing=print echo echo "# Git checkout fails without internet" mv ../server_repo ../server_repo.off ! git checkout master echo echo "# Git checkout fetches the missing directory from internet" mv ../server_repo.off ../server_repo git checkout master -- d1/ echo echo "# Missing objects after checking out d1" git rev-list --all --quiet --objects --missing=print
Salida en Git v2.19.0:
# List and identify all objects c6fcdfaf2b1462f809aecdad83a186eeec00f9c1 fc5e97944480982cfc180a6d6634699921ee63ec 7251a83be9a03161acde7b71a8fda9be19f47128 62d67bce3c672fe2b9065f372726a11e57bade7e b64bf435a3e54c5208a1b70b7bcb0fc627463a75 d1 308150e8fddde043f3dbbb8573abb6af1df96e63 d1/a f70a17f51b7b30fec48a32e4f19ac15e261fd1a4 d1/b 84de03c312dc741d0f2a66df7b2f168d823e122a d2 0975df9b39e23c15f63db194df7f45c76528bccb d2/a 41484c13520fcbb6e7243a26fdb1fc9405c08520 d2/b 7d5230379e4652f1b1da7ed1e78e0b8253e03ba3 master 8b25206ff90e9432f6f1a8600f87a7bd695a24af master/master ef29f15c9a7c5417944cc09711b6a9ee51b01d89 19f7a4ca4a038aff89d803f017f76d2b66063043 mybranch 1b671b190e293aa091239b8b5e8c149411d00523 mybranch/mybranch c3760bb1a0ece87cdbaf9a563c77a45e30a4e30e a0234da53ec608b54813b4271fbf00ba5318b99f root 93ca1422a8da0a9effc465eccbcb17e23015542d root/root master commit SHA: fc5e97944480982cfc180a6d6634699921ee63ec mybranch commit SHA: fc5e97944480982cfc180a6d6634699921ee63ec 040000 tree b64bf435a3e54c5208a1b70b7bcb0fc627463a75 d1 040000 tree 84de03c312dc741d0f2a66df7b2f168d823e122a d2 040000 tree 7d5230379e4652f1b1da7ed1e78e0b8253e03ba3 master 040000 tree 19f7a4ca4a038aff89d803f017f76d2b66063043 mybranch 040000 tree a0234da53ec608b54813b4271fbf00ba5318b99f root # Missing objects after --no-checkout ?f70a17f51b7b30fec48a32e4f19ac15e261fd1a4 ?8b25206ff90e9432f6f1a8600f87a7bd695a24af ?41484c13520fcbb6e7243a26fdb1fc9405c08520 ?0975df9b39e23c15f63db194df7f45c76528bccb ?308150e8fddde043f3dbbb8573abb6af1df96e63 # Git checkout fails without internet fatal: "/home/ciro/bak/git/test-git-web-interface/other-test-repos/partial-clone.tmp/server_repo" does not appear to be a git repository fatal: Could not read from remote repository. Please make sure you have the correct access rights and the repository exists. # Git checkout fetches the missing directory from internet remote: Enumerating objects: 1, done. remote: Counting objects: 100% (1/1), done. remote: Total 1 (delta 0), reused 0 (delta 0) Receiving objects: 100% (1/1), 45 bytes | 45.00 KiB/s, done. remote: Enumerating objects: 1, done. remote: Counting objects: 100% (1/1), done. remote: Total 1 (delta 0), reused 0 (delta 0) Receiving objects: 100% (1/1), 45 bytes | 45.00 KiB/s, done. # Missing objects after checking out d1 ?8b25206ff90e9432f6f1a8600f87a7bd695a24af ?41484c13520fcbb6e7243a26fdb1fc9405c08520 ?0975df9b39e23c15f63db194df7f45c76528bccb
Conclusiones: todos los blobs desde fuera de d1/
faltan. P.ej.0975df9b39e23c15f63db194df7f45c76528bccb
, que es d2/b
no está allí después de comprobar d1/a
.
Tenga en cuenta que root/root
y mybranch/mybranch
también faltan, pero --depth 1
lo oculta de la lista de archivos perdidos. Si elimina --depth 1
, se mostrarán en la lista de archivos faltantes.
Tengo un sueño
Esta función podría revolucionar Git.
Imagine tener todo el código base de su empresa en un solo repositorio sin desagradables herramientas de terceros como repo
.
Imagina almacenando grandes blobs directamente en el repositorio sin extensiones desagradables de terceros .
Imagina si GitHub permitiera metadatos por archivo / directorio como estrellas y permisos, para que puedas almacenar todo tu contenido personal en un solo repositorio.
Imagina si los submódulos se trataron exactamente como directorios normales : solo solicite un árbol SHA y un mecanismo similar al DNS resuelve su solicitud , primero mirando en su local ~/.git
, luego primero a servidores más cercanos (el espejo / caché de su empresa) y terminando en GitHub.
Respuesta
Pruebe esto:
svn export https://github.com/PhantomX/slackbuilds/trunk/${directory}
Comentarios
- Este es la forma más sencilla. No descarga todo el repositorio. Tenga en cuenta que debemos agregar
/trunk
y eliminar/tree/master
. Más aquí - ¡Gracias! Solo quiero clonar una carpeta del repositorio y no todas las carpetas de un repositorio. Y este realmente funciona para mí.
Respuesta
solución de trabajo:
usted necesita desactivar la compresión:
git config --global core.compression 0
entonces necesita usar un clon superficial
git clone --depth=1 <url>
entonces el paso más importante es entrar en cd en su proyecto clonado
cd <shallow cloned project dir>
ahora desabrir el clon, paso a paso
git fetch --depth=N, with increasing N
p. ej.
git fetch --depth=4
luego,
git fetch --depth=100
luego,
git fetch --depth=500
puede elegir cuántos pasos desea reemplazando esta N,
y finalmente descargar todas las revisiones restantes usando,
git fetch --unshallow
vota a favor si te ayuda 🙂
Responder
Finalmente conseguí que esto funcionara gracias a lo anterior. Estaba editando el archivo directamente, obteniendo errores al incluir accidentalmente las comillas. Su archivo .git / info / sparse-checkout debe incluir solo el directorio, sin comillas. Aquí tienes un ejemplo: este proyecto gigantesco: https://github.com/SharePoint/sp-dev-fx-webparts , solo quería react-script-editor en el directorio de samples. https://github.com/SharePoint/sp-dev-fx-webparts / tree / master / samples / react-script-editor
Seguí las instrucciones anteriores y lo hice funcionar cuando mi archivo .git / info / sparse-checkout solo tenía esto
samples / react-script-editor
Respuesta
Esto clonará una carpeta específica y eliminará todo el historial que no esté relacionado con ella.
git clone --single-branch -b {branch} [email protected]:{user}/{repo}.git git filter-branch --subdirectory-filter {path/to/folder} HEAD git remote remove origin git remote add origin [email protected]:{user}/{new-repo}.git git push -u origin master
Comentarios
- Esto aún clonará todo el historial (
--depth=1
para evitar) y todos los demás directorios (???
para evitar?).
Responder
Para repositorios de GitHub, puede clonar cualquier sub -directorios de cualquier repositorio de GitHub (en cualquier referencia) usando https://github.com/HR/github-clone
Comentarios
- Lamentablemente, esto no es adecuado para escenarios de Dockerfile, ya que arrastraría la totalidad de Python como una dependencia solo para usarlo una vez durante la construcción de la imagen.
Responder
Responderé con restricciones específicas que enfrenté.
- En VSO, SSH fue deshabilitado por seguridad, por lo que no se pudo usar el archivo git. Solo se admitió PAT / CredentialProvider.
- Nuestra rama tenía un código enorme, así que git clone en sí mismo tomaría 15 minutos, como mínimo.
Esto es lo que hice:
- Proceso manual de una sola vez: en la interfaz de usuario de VSO, cree una nueva rama remota diga «rama vacía» que no tiene archivos (todos se eliminan).
-
git clone --depth=1 --single-branch --branch emptyBranch <remote>
(bastante rápido) -
git checkout <branchToSyncTo> <directoryToSyncTo>
(desprotege solo una carpeta específica)