Jai trouvé une collection de slackbuilds, dont jai besoin sur GitHub. https://github.com/PhantomX/slackbuilds/ Je ne veux pas obtenir tous les git.

git clone https://github.com/PhantomX/slackbuilds.git 

Mais nobtenez quun slackbuild, pour celui-ci .

Comment faire cela? Est-ce possible?

Commentaires

Réponse

Vous allez finir par télécharger l’historique complet, donc je ne vois pas beaucoup d’avantages, mais vous peut commander des pièces spécifiques en utilisant une caisse « éparse ». Citant ce post Stack Overflow :

Les étapes pour effectuer un clairsemé clone sont les suivants:

mkdir <repo> cd <repo> git init git remote add -f origin <url> 

Cela crée un dépôt vide avec votre télécommande, et récupère tous les objets mais ne les extrait pas. Ensuite à faire:

git config core.sparseCheckout true 

Vous devez maintenant définir les fichiers / dossiers que vous voulez réellement extraire. Pour ce faire, les lister dans .git/info/sparse-checkout, par exemple:

 echo "some/dir/" >> .git/info/sparse-checkout echo "another/sub/tree" >> .git/info/sparse-checkout  

Dernier point mais non le moindre, mettre à jour votre dépôt vide avec létat de la télécommande:

git pull origin master 

Vous voudrez peut-être jeter un œil à didacticiel étendu et vous devriez probablement lire la documentation officielle pour les paiements clairsemés .

Vous feriez peut-être mieux dutiliser un clone superficiel également. Au lieu de git pull commande donnée plus tôt, essayez:

git pull --depth=1 origin master 

Commentaires

  • Jobtiens error: Sparse checkout leaves no entry on working directory après avoir effectué un pull git après avoir modifié core.sparseCheckout et .git/info/sparse-checkout
  • Correction: git init; git remote ... il suffit de configurer les choses, rien nest téléchargé. Lintérêt du clairsemé est dobtenir uniquement les objets qui vous intéressent.
  • @vonbrand qui ‘ est ce que le -f correspond à:  » Avec loption -f, git fetch < nom > est exécuté immédiatement après la configuration des informations distantes.  »
  • Après git remote add -f origin <url> git est toujours en train de télécharger tout le dépôt . Dans mon cas, je ne ‘ pas vouloir passer du temps à attendre cela, même si cela ne ‘ t vérifier lintégralité du dépôt.
  • En cas de paiement fragmenté, nous définissons ce que nous voulons vérifier, mais existe-t-il un moyen dexclure quelques répertoires et de vérifier le reste?

Réponse

git clone --filter de git 2.19 fonctionne désormais sur GitHub (testé le 2020-09 -18, git 2.25.1)

Cette option a été ajoutée avec une mise à jour du protocole distant, et elle empêche vraiment le téléchargement dobjets depuis le serveur.

Par exemple, pour ne cloner que les objets requis pour d1 de ce référentiel: https://github.com/cirosantilli/test-git-partial-clone Je peux faire:

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 

La commande clone obtient uniquement:

Ensuite, la commande checkout récupère uniquement les blobs (fichiers) manquants sur le serveur:

  • d1/a
  • d1/b

Encore mieux, plus tard, GitHub commencera probablement à prendre en charge:

 --filter=blob:none \ --filter=tree:0 \ 

--filter=tree:0 de Git 2.20 empêchera le clone récupération inutile de tous les objets de larborescence, et autorisez-le à être reporté à checkout. Mais sur mon test du 18/09/2020 qui échoue avec:

fatal: invalid filter-spec "combine:blob:none+tree:0" 

probablement parce que le filtre composite --filter=combine: ( ajoutée dans Git 2.24, impliquée par plusieurs --filter) nest pas encore implémentée.

Jai observé quels objets ont été récupérés avec:

git verify-pack -v .git/objects/pack/*.pack 

comme mentionné à: https://stackoverflow.com/questions/7348698/git-how-to-list-all-objects-in-the-database/18793029#18793029 Cela ne me donne pas une indication très claire de ce quest exactement chaque objet, mais il indique le type de chaque objet (commit, tree, blob), et comme il y a si peu dobjets dans ce dépôt minimal, je peux déduire sans ambiguïté ce que chacun objet est.

git rev-list --objects --all a produit une sortie plus claire avec des chemins pour les arbres / blobs, mais il récupère malheureusement certains objets lorsque je lexécute, ce qui rend difficile la détermination ce qui a été récupéré quand, faites-moi savoir si quelquun a une meilleure commande.

TODO trouve lannonce GitHub qui dit quand ils ont commencé à le supporter. https://github.blog/2020-01-17-bring-your-monorepo-down-to-size-with-sparse-checkout/ du 17/01/2020 mentionne déjà --filter blob:none.

git sparse-checkout

I pense que cette commande est destinée à gérer un fichier de paramètres qui dit  » Je ne me soucie que de ces sous-arbres  » afin que les futures commandes naffectent que ceux-ci sous-arbres. Mais cest un peu difficile den être sûr car la documentation actuelle est un peu … clairsemée 😉

Elle nempêche pas, à elle seule, la récupération des blobs.

Si cette compréhension est correcte, alors ce serait un bon complément à git clone --filter décrit ci-dessus, car cela empêcherait la récupération non intentionnelle de plus dobjets si vous avez lintention de faire des opérations git dans le dépôt cloné partiel .

Quand jai essayé sur 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 

cela na pas fonctionné parce que le init a en fait récupéré tous les objets.

Cependant, dans Git 2.28, il na pas récupéré les objets comme souhaité. Mais si je le fais:

git sparse-checkout set d1 

d1 nest pas récupéré et extrait, même si cela lindique explicitement devrait: https://github.blog/2020-01-17-bring-your-monorepo-down-to-size-with-sparse-checkout/ # sparse-checkout-and-partial-clones Avec clause de non-responsabilité:

Gardez un œil sur la fonctionnalité de clonage partiel pour devenir généralement disponible [1].

[1]: GitHub évalue toujours cette fonctionnalité en interne tant quelle est activée sur quelques référentiels sélectionnés (y compris lexemple utilisé dans cet article). Au fur et à mesure que la fonctionnalité se stabilise et mûrit, nous vous tiendrons au courant de sa progression.

Alors oui, cest trop difficile dêtre certain à la moment, grâce en partie aux joies de GitHub étant la source fermée. Mais gardons un œil dessus.

Répartition des commandes

Le serveur doit être configuré avec:

git config --local uploadpack.allowfilter 1 git config --local uploadpack.allowanysha1inwant 1 

Répartition des commandes:

Le format de --filter est documenté sur man git-rev-list.

Documents sur larborescence Git:

Testez-le localement

Le script suivant génère de manière reproductible le https://github.com/cirosantilli/test-git-partial-clone dépôt localement, effectue un clonage local et observe ce qui a été 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 en amont .

Sortie dans 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 

Conclusions: tous les blobs de lextérieur de d1/ sont manquants. Par exemple.0975df9b39e23c15f63db194df7f45c76528bccb, qui est d2/b nest pas là après avoir vérifié d1/a.

Notez que root/root et mybranch/mybranch sont également manquants, mais --depth 1 cache cela de la liste des fichiers manquants. Si vous supprimez --depth 1, alors ils apparaissent sur la liste des fichiers manquants.

Jai un rêve

Cette fonctionnalité pourrait révolutionner Git.

Imaginez avoir toute la base de code de votre entreprise dans un seul dépôt sans outils tiers horribles comme repo .

Imaginez stocker dénormes blobs directement dans le référentiel sans aucune extension tierce laide .

Imaginez si GitHub autoriserait par métadonnées de fichier / répertoire comme les étoiles et les autorisations, vous pouvez donc stocker toutes vos données personnelles dans un seul dépôt.

Imaginez si les sous-modules ont été traités exactement comme des répertoires normaux : il vous suffit de demander un arbre SHA, et un mécanisme de type DNS résout votre demande , première recherche sur votre local ~/.git , puis dabord vers des serveurs plus proches (le miroir / cache de votre entreprise) et finissant sur GitHub.

Réponse

Essayez ceci:

svn export https://github.com/PhantomX/slackbuilds/trunk/${directory} 

Commentaires

  • Ceci est le moyen le plus simple. Il ne télécharge pas tout le dépôt. Notez que nous devons ajouter le /trunk et supprimer /tree/master. Plus dinformations ici
  • Merci! Je veux juste cloner un dossier du repo et non tous les dossiers dun repo. Et celui-ci fonctionne vraiment pour moi.

Réponse

solution de travail:

vous besoin de désactiver la compression:

git config --global core.compression 0 

alors vous devez utiliser le clone peu profond

git clone --depth=1 <url> 

alors létape la plus importante est de faire un cd dans votre projet cloné

cd <shallow cloned project dir> 

maintenant désouvrir le clone, étape par étape

git fetch --depth=N, with increasing N 

par exemple.

git fetch --depth=4 

puis,

git fetch --depth=100 

ensuite,

git fetch --depth=500 

vous pouvez choisir le nombre détapes que vous voulez en remplaçant ce N,

et enfin télécharger toutes les révisions restantes en utilisant,

git fetch --unshallow 

upvote si cela vous aide 🙂

Answer

Jai enfin réussi à faire fonctionner cela grâce à ce qui précède. Jétais en train de modifier le fichier directement, obtenant des erreurs en incluant accidentellement les citations. Votre fichier .git / info / sparse-checkout doit inclure uniquement le répertoire, sans guillemets. Voici un exemple: Ce projet gigantesque: https://github.com/SharePoint/sp-dev-fx-webparts , je voulais juste l’éditeur de script react dans le Répertoire dexemples. https://github.com/SharePoint/sp-dev-fx-webparts / tree / master / samples / react-script-editor

Jai suivi les instructions ci-dessus et je lai fait fonctionner lorsque mon fichier .git / info / sparse-checkout contenait exactement cela

samples / react-script-editor

Réponse

Cela clonera un dossier spécifique et supprimera tout lhistorique sans rapport avec celui-ci.

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 

Commentaires

  • Cela clonera toujours tout lhistorique (--depth=1 à éviter), et tous les autres répertoires (??? à éviter?).

Réponse

Pour les dépôts GitHub, vous pouvez cloner nimporte quel sous -répertoire de nimporte quel référentiel GitHub (à nimporte quelle référence) utilisant https://github.com/HR/github-clone

Commentaires

  • Malheureusement, cela ne convient pas pour les scénarios Dockerfile car il transporterait lintégralité de Python en tant que dépendance juste pour lutiliser une fois pendant la construction de limage.

Réponse

Je « répondrai avec des restrictions spécifiques auxquelles jai été confronté.

  • Dans VSO, SSH était désactivé par la sécurité, donc ne pouvait pas utiliser larchive git. Seul PAT / CredentialProvider était pris en charge.
  • Notre branche avait un code énorme, donc git clone prendrait au minimum 15 minutes.

Voici ce que jai fait:

  1. Processus manuel unique: dans VSO UI, créez un nouveau la branche distante dit « emptyBranch » qui na aucun fichier (tous sont supprimés).
  2. git clone --depth=1 --single-branch --branch emptyBranch <remote> (assez rapide)
  3. git checkout <branchToSyncTo> <directoryToSyncTo> (extrait uniquement un dossier spécifique)

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *