Est-il possible d'extraire les sous-répertoires d'un référentiel dans Git?
Imaginez que je mets en place une nouvelle installation WordPress. Je vais créer deux nouveaux répertoires pour ma personnalisation de plugin et de thème:
wordpress/wp-content/plugins/myplugins/
wordpress/wp-content/themes/mytheme/
Je souhaite maintenir ces répertoires via Git. Dans Subversion, j'accomplir cela en ayant trunk/myplugins/
et trunk/mytheme/
répertoires et vérifier les sous - répertoires. Git a-t-il un moyen d'accomplir la même tâche en utilisant un seul référentiel?
Je pourrais juste manquer le bateau sur un paradigme Git, en tant qu'utilisateur de SVN de longue date avec peu d'exposition à Git.
Edit: plusieurs branches stockant un contenu différent est un moyen intéressant de gérer cela.
git
sparse-checkout
Annika Backstrom
la source
la source
Réponses:
Les extractions éparses sont maintenant dans Git 1.7 .
Voir également la question « Est-il possible d'effectuer une extraction clairsemée sans avoir d'abord vérifié l'ensemble du référentiel? ».
Notez que les extractions éparses vous obligent toujours à télécharger l'intégralité du référentiel, même si certains des fichiers téléchargés par Git ne se retrouveront pas dans votre arbre de travail.
la source
git clone
simple commande ?? Eh bien, j'utilise cette réponse , ça marche!/foo/bar/foobar
, est-il possible de le voir uniquement comme/foobar
dans mon référentiel local?Il n'y a pas vraiment de moyen de faire cela dans git. Et si vous n'effectuez pas de modifications qui affectent les deux arbres à la fois en tant qu'unité de travail unique, il n'y a aucune bonne raison d'utiliser un seul référentiel pour les deux. Je pensais que cette fonctionnalité de Subversion me manquerait, mais j'ai trouvé que la création de référentiels a si peu de frais administratifs mentaux (simplement en raison du fait que les référentiels sont stockés juste à côté de leur copie de travail, plutôt que de m'obliger à choisir explicitement un endroit en dehors du copie de travail) que je me suis habitué à créer de nombreux petits référentiels à usage unique.
Si vous insistez (ou en avez vraiment besoin), vous pouvez créer un référentiel git avec just
mytheme
etmyplugins
répertoires et créer un lien symbolique avec ceux-ci depuis l'installation de WordPress.MDCore a écrit:
Notez que ce n'est pas un problème pour git, si vous décidez de placer les deux répertoires dans un seul référentiel, car git supprime entièrement le concept d'augmentation monotone des numéros de révision de toute forme.
Le seul critère pour ce que les choses à mettre ensemble dans un seul référentiel dans git est de savoir s'il constitue une seule unité, c'est-à-dire. dans votre cas, s'il y a des changements pour lesquels il n'est pas logique d'examiner les modifications dans chaque répertoire de manière isolée. Si vous avez des modifications pour lesquelles vous devez éditer des fichiers dans les deux répertoires à la fois et que les modifications vont ensemble, elles doivent constituer un seul référentiel. Sinon, ne les glissez pas ensemble.
Git veut vraiment que vous utilisiez des référentiels séparés pour des entités séparées.
Les sous - modules ne traitent pas le désir de garder les deux répertoires dans un référentiel, parce qu'ils seraient effectivement mettre en vigueur ayant un dépôt distinct pour chaque répertoire, qui sont ensuite réunis dans un autre référentiel à l' aide des sous - modules. Pire encore, étant donné que les répertoires à l'intérieur de l'installation de WordPress ne sont pas des sous-répertoires directs du même répertoire et font également partie d'une hiérarchie avec de nombreux autres fichiers, l'utilisation des référentiels par répertoire comme sous-modules dans un référentiel unifié n'offrirait aucun avantage, car l'unifié le référentiel ne refléterait aucun cas d'utilisation / besoin.
la source
git clone
simple séquence de commandes ?? Eh bien, j'utilise cette réponse , ça marche!Une chose que je n'aime pas dans les extractions éparses, c'est que si vous voulez extraire un sous-répertoire de quelques répertoires de profondeur, votre structure de répertoires doit contenir tous les répertoires qui y mènent.
La façon de contourner ce problème consiste à cloner le référentiel dans un endroit qui n'est pas mon espace de travail, puis à créer un lien symbolique dans le répertoire de mon espace de travail vers le sous-répertoire du référentiel. Git fonctionne très bien comme ça car des choses comme git status afficheront les fichiers de changement par rapport à votre répertoire de travail actuel.
la source
En fait, les extractions "étroites", "partielles" ou "éparses" sont en cours de développement intensif pour Git. Notez que vous aurez toujours le référentiel complet sous
.git
. Donc, les deux autres articles sont à jour pour l'état actuel de Git, mais il semble que nous serons en mesure de faire des vérifications éparses éventuellement. Consultez les listes de diffusion si vous êtes intéressé par plus de détails - elles changent rapidement.la source
git clone --filter
à partir de Git 2.19Cette option ignorera en fait la récupération des objets inutiles du serveur:
Le serveur doit être configuré avec:
Il n'y a pas de support de serveur à partir de la v2.19.0, mais il peut déjà être testé localement.
file://$(path)
est nécessaire pour surmontergit clone
les manigances de protocole: comment cloner superficiellement un référentiel git local avec un chemin relatif?Rappelez-vous que cela
--depth 1
implique déjà--single-branch
, voir aussi: Comment cloner une seule branche dans Git?TODO:
--filter=blob:none
ignore tous les objets blob, mais récupère toujours tous les objets de l'arborescence. Mais sur un dépôt normal, cela devrait être minuscule par rapport aux fichiers eux-mêmes, donc c'est déjà assez bon. Interrogé sur: https://www.spinics.net/lists/git/msg342006.html Les développeurs ont répondu un--filter=tree:0
était en train de le faire.Le format de
--filter
est documenté surman git-rev-list
.Une extension a été apportée au protocole distant Git pour prendre en charge cette fonctionnalité.
Docs sur l'arbre Git:
Testez-le
GitHub en amont .
Sortie dans Git v2.19:
Conclusions: tous les blobs extérieurs à
d1/
sont manquants.Notez que
root/root
etmybranch/mybranch
sont également manquants, mais--depth 1
masque cela dans la liste des fichiers manquants. Si vous supprimez--depth 1
, ils apparaissent dans la liste des fichiers manquants.la source
Comme votre édition le souligne, vous pouvez utiliser deux branches distinctes pour stocker les deux répertoires séparés. Cela les garde tous les deux dans le même référentiel, mais vous ne pouvez toujours pas avoir de commits couvrant les deux arborescences de répertoires. Si vous avez un changement dans l'un qui nécessite un changement dans l'autre, vous devrez le faire en tant que deux commits distincts, et vous ouvrirez la possibilité qu'une paire d'extraction des deux répertoires puisse se désynchroniser.
Si vous voulez traiter la paire de répertoires comme une seule unité, vous pouvez utiliser 'wordpress / wp-content' comme racine de votre dépôt et utiliser le fichier .gitignore au niveau supérieur pour ignorer tout sauf les deux sous-répertoires d'intérêt. C'est probablement la solution la plus raisonnable à ce stade.
Des contrôles clairsemés arriveraient depuis deux ans maintenant, mais il n'y a toujours aucun signe d'eux dans le dépôt de développement git, ni aucune indication que les changements nécessaires y arriveront un jour. Je ne compterais pas sur eux.
la source
Vous ne pouvez pas extraire un seul répertoire d'un référentiel car l'ensemble du référentiel est géré par le dossier .git unique à la racine du projet au lieu de la myriade de répertoires .svn de Subversion.
Le problème avec le travail sur des plugins dans un référentiel unique est que faire un commit sur, par exemple, mytheme incrémentera le numéro de révision de myplugin , donc même en subversion, il est préférable d'utiliser des référentiels séparés.
Le paradigme de subversion pour les sous-projets est svn: externals qui se traduit quelque peu en sous-modules dans git (mais pas exactement au cas où vous auriez déjà utilisé svn: externals).
la source
Il y a une inspiration ici. Utilisez simplement
shell regex
ougit regex
.Utilisez les guillemets pour échapper à l'interprétation des expressions régulières du shell et passez des caractères génériques à git.
Le premier n'est pas récursif, uniquement des fichiers en profondeur 1
subdir
. Mais le second est récursif.Quant à votre situation, ce qui suit peut suffire.
Piratez simplement les lignes selon vos besoins.
la source
Vous ne pouvez annuler les modifications non validées que dans un fichier ou un répertoire particulier:
la source