J'ai mon dépôt Git qui, à la racine, a deux sous-répertoires:
/finisht
/static
Lorsque cela était dans SVN , a /finisht
été vérifié à un endroit, alors qu'il a /static
été vérifié ailleurs, comme ceci:
svn co svn+ssh://[email protected]/home/admin/repos/finisht/static static
Existe-t-il un moyen de le faire avec Git?
git
repository
subdirectory
git-clone
sparse-checkout
Nick Sergeant
la source
la source
git clone
commande la plus simple ?? J'ai utilisé cette réponse simple . S'il y a quelque chose de plus simple, veuillez commenterRéponses:
EDIT : Depuis Git 2.19, c'est enfin possible, comme on peut le voir dans cette réponse .
Pensez à voter pour cette réponse.
Remarque: dans Git 2.19, seule la prise en charge côté client est implémentée, la prise en charge côté serveur est toujours manquante, elle ne fonctionne donc que lors du clonage de référentiels locaux. Notez également que les gros hébergeurs Git, par exemple GitHub, n'utilisent pas réellement le serveur Git, ils utilisent leur propre implémentation, donc même si le support apparaît dans le serveur Git, cela ne signifie pas automatiquement qu'il fonctionne sur les hébergeurs Git. (OTOH, car ils n'utilisent pas le serveur Git, ils pourraient l'implémenter plus rapidement dans leurs propres implémentations avant qu'il n'apparaisse dans le serveur Git.)
Non, ce n'est pas possible dans Git.
Implémenter quelque chose comme ça dans Git serait un effort substantiel et cela signifierait que l'intégrité du référentiel côté client ne pourrait plus être garantie. Si vous êtes intéressé, recherchez des discussions sur "clone clairsemé" et "extraction clairsemée" sur la liste de diffusion git.
En général, le consensus dans la communauté Git est que si vous avez plusieurs répertoires qui sont toujours vérifiés indépendamment, alors ce sont vraiment deux projets différents et devraient vivre dans deux référentiels différents. Vous pouvez les coller de nouveau ensemble à l'aide des sous-modules Git .
la source
git-read-tree
, ce qui est longtemps aprèsget-fetch
. La question n'était pas de vérifier uniquement un sous-répertoire, il s'agissait de cloner uniquement un sous-répertoire. Je ne vois pas comment les extractions clairsemées pourraient éventuellement faire cela, cargit-read-tree
s'exécute une fois le clone terminé.Ce que vous essayez de faire s'appelle une caisse creuse , et cette fonctionnalité a été ajoutée dans git 1.7.0 (février 2012). Les étapes pour faire un clone clairsemé sont les suivantes:
Cela crée un référentiel vide avec votre télécommande et récupère tous les objets mais ne les extrait pas. Alors fais:
Vous devez maintenant définir les fichiers / dossiers que vous souhaitez réellement extraire. Cela se fait en les répertoriant
.git/info/sparse-checkout
, par exemple:Enfin, mettez à jour votre référentiel vide avec l'état de la télécommande:
Vous aurez maintenant des fichiers «extraits» pour
some/dir
etanother/sub/tree
sur votre système de fichiers (avec ces chemins toujours), et aucun autre chemin présent.Vous voudrez peut-être jeter un coup d'œil au didacticiel étendu et vous devriez probablement lire la documentation officielle pour un paiement clairsemé .
En tant que fonction:
Usage:
Notez que cela téléchargera toujours le référentiel entier depuis le serveur - seule la caisse est réduite en taille. Pour le moment, il n'est pas possible de cloner un seul répertoire. Mais si vous n'avez pas besoin de l'historique du référentiel, vous pouvez au moins économiser de la bande passante en créant un clone peu profond. Voir la réponse d'udondan ci-dessous pour plus d'informations sur la façon de combiner un clone peu profond et un paiement clairsemé.
Depuis git 2.25.0 (janvier 2020), une commande expérimentale de vérification clairsemée est ajoutée dans git:
la source
https://github.com/Umkus/nginx-boilerplate/tree/master/src
droit dans/etc/nginx
git remote add
commande n'implique pas une extraction, maisgit remote add -f
, comme utilisée ici, oui! Voilà ce que cela-f
signifie.--depth=1
j'ai cloné Chromium Devtools dans 338 Mo au lieu de 4,9 Go de source Blink complète + historique. Excellent.git clone --filter
de Git 2.19Cette option sautera en fait la récupération des objets inutiles du serveur. Incluant également
--filter=tree:0
Git 2.20 et le--filter=combine
filtre composite ajouté dans Git 2.24, nous nous retrouvons avec:Le serveur doit être configuré avec:
Une extension a été apportée au protocole distant Git pour prendre en charge cette fonctionnalité
v2.19.0
et ignorer la récupération d'objets inutiles, mais il n'y a pas de prise en charge de serveur pour le moment. Mais il peut déjà être testé localement.Répartition des commandes:
--filter=blob:none
ignore tous les blobs, mais récupère toujours tous les objets d'arbre--filter=tree:0
saute les arbres inutiles: https://www.spinics.net/lists/git/msg342006.html--depth 1
implique déjà--single-branch
, voir aussi: Comment cloner une seule branche dans Git?file://$(path)
est nécessaire pour surmontergit clone
les manigances du protocole: Comment cloner superficiellement un dépôt git local avec un chemin relatif?--filter=combine:FILTER1+FILTER2
est la syntaxe pour utiliser plusieurs filtres à la fois, essayer de passer--filter
pour une raison quelconque échoue avec: "plusieurs spécifications de filtre ne peuvent pas être combinées". Ceci a été ajouté dans Git 2.24 à e987df5fe62b8b29be4cdcdeb3704681ada2b29e "list-objects-filter: implement composite filters"Le format de
--filter
est documenté surman git-rev-list
.Documents sur l'arbre Git:
Testez-le
GitHub en amont .
Sortie dans Git v2.19.0:
Conclusions: tous les blobs de l'extérieur de
d1/
sont manquants. Par exemple0975df9b39e23c15f63db194df7f45c76528bccb
, qui n'estd2/b
pas là après le départd1/a
.Notez que
root/root
etmybranch/mybranch
sont également manquants, mais les--depth 1
masquent dans la liste des fichiers manquants. Si vous supprimez--depth 1
, ils apparaissent sur la liste des fichiers manquants.J'ai un rêve
Cette fonctionnalité pourrait révolutionner Git.
Imaginez avoir toute la base de code de votre entreprise dans un seul référentiel sans outils tiers laids comme
repo
.Imaginez que vous stockiez d'énormes blobs directement dans le référentiel sans aucune extension tierce laide .
Imaginez si GitHub autoriserait par métadonnées par fichier / répertoire comme les étoiles et les autorisations, afin que vous puissiez stocker toutes vos données personnelles sous un seul dépôt.
Imaginez si les sous - modules étaient traités exactement comme des répertoires normaux : demandez simplement un arbre SHA, et un mécanisme de type DNS résout votre demande , en regardant d'abord votre serveur local
~/.git
, puis d'abord vers des serveurs plus proches (miroir / cache de votre entreprise) et se retrouvant sur GitHub.la source
fatal: invalid filter-spec 'combine:blob:none+tree:0'
Merci quand même! Peut-être que cela fonctionnera avec des versions plus récentes.Vous pouvez combiner l' extraction clairsemée et les fonctionnalités de clonage superficiel . Le clone superficiel coupe l'historique et la vérification clairsemée extrait uniquement les fichiers correspondant à vos modèles.
Vous aurez besoin de git 1.9 minimum pour que cela fonctionne. Je l'ai testé moi-même uniquement avec 2.2.0 et 2.2.2.
De cette façon, vous pourrez toujours pousser , ce qui n'est pas possible avec
git archive
.la source
git pull --depth=1 origin master
maisgit pull --depth=1 origin <any-other-branch>
. c'est tellement étrange, voir ma question ici: stackoverflow.com/questions/35820630/…Pour les autres utilisateurs qui souhaitent simplement télécharger un fichier / dossier à partir de github, utilisez simplement:
par exemple
(oui, c'est svn ici. apparemment en 2016 vous avez toujours besoin de svn pour simplement télécharger des fichiers github)
Courtoisie: télécharger un dossier ou un répertoire unique à partir d'un référentiel GitHub
Important - Assurez-vous de mettre à jour l'URL github et de le remplacer
/tree/master/
par '/ trunk /'.En tant que script bash:
Remarque Cette méthode télécharge un dossier, ne le clone pas / ne l'extrait pas. Vous ne pouvez pas repousser les modifications dans le référentiel. D'un autre côté - cela se traduit par un téléchargement plus petit par rapport à une caisse creuse ou une caisse peu profonde.
la source
https://github.com/tensorflow/tensorflow/tree/master/tensorflow/examples/trunk/udacity
mais j'ai eu unesvn: E170000: URL 'https://github.com/tensorflow/tensorflow/tree/master/tensorflow/examples/trunk/udacity' doesn't exist
erreur :(Si vous ne prévoyez jamais d'interagir avec le référentiel à partir duquel vous avez cloné, vous pouvez faire un clone complet de git et réécrire votre référentiel en utilisant git filter-branch --subdirectory-filter . De cette façon, au moins l'histoire sera préservée.
la source
git filter-branch --subdirectory-filter <subdirectory>
git clone https://github.com/your/repo_xx.git && cd repo_xx && git filter-branch --subdirectory-filter repo_xx_subdir
Cela semble beaucoup plus simple:
la source
svn export
placeGit 1.7.0 a des «caisses clairsemées». Voir «core.sparseCheckout» dans la page de manuel de git config , «Sparse checkout» dans la page de manuel de git read-tree et «Skip-worktree bit» dans la page de manuel de git update-index .
L'interface n'est pas aussi pratique que celle de SVN (par exemple, il n'y a aucun moyen d'effectuer une extraction clairsemée au moment d'un clone initial), mais la fonctionnalité de base sur laquelle des interfaces plus simples pourraient être construites est maintenant disponible.
la source
Il n'est pas possible de cloner un sous-répertoire uniquement avec Git, mais voici quelques solutions de contournement.
Branche de filtre
Vous voudrez peut-être réécrire le référentiel pour qu'il ressemble à
trunk/public_html/
sa racine de projet et supprimer tous les autres historiques (en utilisantfilter-branch
), essayez déjà la branche de paiement:Remarques: le
--
qui sépare les options de branche de filtre des options de révision et le--all
pour réécrire toutes les branches et balises. Toutes les informations, y compris les heures de validation d'origine ou les informations de fusion, seront conservées . Cette commande honore le.git/info/grafts
fichier et les références dans l'refs/replace/
espace de noms, donc si vous avezrefs
défini des greffons ou des remplacements , l'exécution de cette commande les rendra permanents.Caisse clairsemée
Voici des étapes simples avec une approche de vérification clairsemée qui remplira le répertoire de travail de manière clairsemée, de sorte que vous pouvez dire à Git quel (s) dossier (s) ou fichier (s) du répertoire de travail mérite d'être vérifié.
Clonez le dépôt comme d'habitude (
--no-checkout
est facultatif):Vous pouvez ignorer cette étape si votre référentiel est déjà cloné.
Astuce: pour les grands dépôts, considérez clone (
--depth 1
) superficiel pour extraire uniquement la dernière révision ou / et--single-branch
uniquement.Activer l'
sparseCheckout
option:Spécifiez le (s) dossier (s) pour une extraction clairsemée ( sans espace à la fin):
ou modifier
.git/info/sparse-checkout
.Commander la succursale (par exemple
master
):Vous devriez maintenant avoir sélectionné des dossiers dans votre répertoire actuel.
Vous pouvez envisager des liens symboliques si vous avez trop de niveaux de répertoires ou de branche de filtrage à la place.
la source
pull
?filter-branch
réécrirait les validations parentes afin qu'elles aient des ID SHA1 différents, et donc votre arborescence filtrée n'aurait aucune validation en commun avec l'arborescence distante.git pull
ne saurait d'où essayer de fusionner.Je viens d' écrire un script pour GitHub .
Usage:
la source
Cela clonera un dossier spécifique et supprimera tout l'historique qui ne lui est pas lié.
la source
Voici un script shell que j'ai écrit pour le cas d'utilisation d'une extraction fragmentaire d'un seul sous-répertoire
coSubDir.sh
la source
ln -s ./.$localRepo/$subDir $localRepo
place deln -s ./.$localRepo$subDir $localRepo
J'ai écrit un
.gitconfig
[alias]
pour effectuer une "caisse clairsemée". Vérifiez-le (sans jeu de mots):Sous Windows, exécutez
cmd.exe
Autrement:
Utilisation :
Les
git config
commandes sont «minifiées» pour plus de commodité et de stockage, mais voici l'alias développé:la source
L=${1##*/} L=${L%.git}
:? L'espace est-il un opérateur?Vous utilisez Linux? Et vous voulez seulement un arbre de travail facile d'accès et propre? sans déranger le reste du code sur votre machine. essayez les liens symboliques !
Tester
la source
Juste pour clarifier certaines des bonnes réponses ici, les étapes décrites dans de nombreuses réponses supposent que vous avez déjà un référentiel distant quelque part.
Éléments fournis: un référentiel git existant, par exemple
[email protected]:some-user/full-repo.git
, avec un ou plusieurs répertoires que vous souhaitez extraire indépendamment du reste du référentiel, par exemple les répertoires nommésapp1
etapp2
En supposant que vous ayez un dépôt git comme ci-dessus ...
Ensuite: vous pouvez exécuter des étapes comme les suivantes pour extraire uniquement des répertoires spécifiques de ce référentiel plus important:
Je pensais à tort que les options de caisse clairsemée devaient être définies sur le référentiel d'origine: ce n'est pas le cas. Vous définissez les répertoires que vous souhaitez localement, avant de tirer de la télécommande. J'espère que cette clarification aide quelqu'un d'autre.
la source
Bien que je déteste avoir à utiliser svn pour traiter avec git repos: / je l'utilise tout le temps;
Cela vous permet de copier à partir de l'url de github sans modification. Usage;
la source
Si vous n'êtes réellement intéressé que par les derniers fichiers de révision d'un répertoire, Github vous permet de télécharger un référentiel en tant que fichier Zip, qui ne contient pas d'historique. Le téléchargement est donc beaucoup plus rapide.
la source
J'ai donc tout essayé dans cette bande de roulement et rien n'a fonctionné pour moi ... Il s'avère que sur la version 2.24 de Git (celle qui est livrée avec cpanel au moment de cette réponse), vous n'avez pas besoin de le faire
tout ce dont vous avez besoin est le nom du dossier
Donc en bref vous faites ça
vous modifiez ensuite le .git / info / sparse-checkout et ajoutez les noms de dossier (un par ligne) avec / * à la fin pour obtenir les sous-dossiers et les fichiers
Enregistrez et exécutez la commande d'extraction
Le résultat était le dossier attendu de mon dépôt et rien d'autre Upvote si cela fonctionnait pour vous
la source