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
- stackoverflow.com/a/13738951/2072269
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:
- un seul objet de commit avec la pointe de la
master
branche - les 4 objets de larborescence du référentiel:
- répertoire de premier niveau de commit
- les trois répertoires
d1
,d2
,master
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 \
où --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:
-
--filter=blob:none
ignore tous les objets blob, mais récupère toujours tous les objets darborescence -
--filter=tree:0
ignore les arbres inutiles: https://www.spinics.net/lists/git/msg342006.html -
--depth 1
implique déjà--single-branch
, voir aussi: https://stackoverflow.com/questions/1778088/how-to-clone-a-single-branch-in-git -
file://$(path)
est nécessaire pour surmonter lesgit clone
manigances de protocole: https://stackoverflow.com/questions/47307578/how-to-shallow-clone-a-local-git-repository-with-a-relative-path -
--filter=combine:FILTER1+FILTER2
est la syntaxe pour utiliser plusieurs filtres à une fois, essayer de passer--filter
pour une raison quelconque échoue avec: » plusieurs filtres-spécifications ne peuvent pas être combinés « . Cela a été ajouté dans Git 2.24 à e987df5fe62b8b29be4cdcdeb3704681ada2b29e » list-objects-filter: implémentez des filtres composites »Modifier: sur Git 2.28, je vois expérimentalement que
--filter=FILTER1 --filter FILTER2
a également le même effet, puisque GitHub nimplémente pas encorecombine:
à partir du 2020-09- 18 et se plaintfatal: invalid filter-spec "combine:blob:none+tree:0"
. TODO introduit dans quelle version?
Le format de --filter
est documenté sur man git-rev-list
.
Documents sur larborescence 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
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
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:
- Processus manuel unique: dans VSO UI, créez un nouveau la branche distante dit « emptyBranch » qui na aucun fichier (tous sont supprimés).
-
git clone --depth=1 --single-branch --branch emptyBranch <remote>
(assez rapide) -
git checkout <branchToSyncTo> <directoryToSyncTo>
(extrait uniquement un dossier spécifique)