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

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 en core.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:

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:

El formato de --filter está documentado en man git-rev-list.

Documentos en el árbol de Git:

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 

GitHub upstream .

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:

  1. 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).
  2. git clone --depth=1 --single-branch --branch emptyBranch <remote> (bastante rápido)
  3. git checkout <branchToSyncTo> <directoryToSyncTo> (desprotege solo una carpeta específica)

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *