Elle est maintenant implémentée (git 1.9/2.0, Q1 2014) avec l'introduction de magie des chemins :(exclude)
et sa forme abrégée :!
en commit ef79b1f y commit 1649612 , par Nguyễn Thái Ngọc Duy ( pclouds
) La documentation est disponible à l'adresse suivante aquí .
Vous pouvez maintenant tout enregistrer sauf le contenu d'un sous-dossier :
git log -- . ':(exclude)sub'
git log -- . ':!sub'
Vous pouvez également exclure des éléments spécifiques de ce sous-dossier.
-
un fichier spécifique :
git log -- . ':(exclude)sub/sub/file'
git log -- . ':!sub/sub/file'
-
n'importe quel fichier donné dans sub
:
git log -- . ':(exclude)sub/*file'
git log -- . ':!sub/*file'
git log -- . ':(exclude,glob)sub/*/file'
Vous pouvez rendre cette exclusion insensible à la casse !
git log -- . ':(exclude,icase)SUB'
En tant que Kenny Evitt a noté
N'oubliez pas d'utiliser des guillemets simples ou un échappement correct entre guillemets doubles si vous utilisez la fonction git
dans un bash
coquille, par exemple ':!sub'
o ":\!sub"
. Dans le cas contraire, vous rencontrerez bash: ... event not found
erreurs
Note : Git 2.13 (Q2 2017) ajoute un synonyme ^
a !
Véase commit 859b7f1 , commit 42ebeb9 (08 février 2017) par Linus Torvalds ( torvalds
) .
(fusionné par Junio C Hamano -- gitster
-- en commettre 015fba3 , 27 février 2017)
pathspec magic : ajouter ' ^
' comme alias de ' !
'
Le choix de ' !
pour un chemin d'accès négatif ne correspond non seulement pas à ce que nous faisons pour les révisions, mais c'est aussi un caractère horrible pour l'expansion de l'interpréteur de commandes puisqu'il a besoin d'être cité.
Ajoutez donc ' ^
' comme alias alternatif pour une entrée de pathpec exclue.
Notez qu'avant Git 2.28 (Q3 2020), l'utilisation de pathpec négatif, lors de la collecte des chemins, y compris les chemins non suivis dans l'arbre de travail, était cassée.
Véase commit f1f061e (05 Jun 2020) par Elijah Newren ( newren
) .
(fusionné par Junio C Hamano -- gitster
-- en commit 64efa11 , 18 juin 2020)
dir
: Correction du traitement des spécifications de chemin négatives
Rapporté par : John Millikin
Signé par : Elijah Newren
do_match_pathspec()
a débuté en tant que match_pathspec_depth_1()
et, par souci d'exactitude, n'était censé être appelé qu'à partir de match_pathspec_depth()
. match_pathspec_depth()
a ensuite été rebaptisée match_pathspec()
, de sorte que l'invariant auquel nous nous attendons aujourd'hui est le suivant do_match_pathspec()
n'a pas d'interlocuteurs directs en dehors de match_pathspec()
.
Malheureusement, cette intention a été perdue avec le renommage des deux fonctions et les appels supplémentaires à do_match_pathspec()
ont été ajoutés dans les commits
-
75a6315f74 ("
ls-files
: add pathpec matching for submodules", 2016-10-07, Git v2.11.0-rc0 -- fusionner figurant sur la liste des lot n°11 )
-
89a1f4aaf7 ("
dir
: if our pathpec might match files under a dir, recurse into it", 2019-09-17, Git v2.24.0-rc0).
Bien sûr, do_match_pathspec()
avait un avantage important par rapport à match_pathspec()
-- match_pathspec()
codait en dur les drapeaux à l'une des deux valeurs, et ces nouveaux appelants devaient passer une autre valeur pour les drapeaux.
De même, bien que l'appel à do_match_pathspec()
était directement incorrect, il n'y avait probablement pas de différence dans le résultat final observable, parce que le bogue signifiait simplement que fill_diretory()
se retrouverait dans des répertoires inutiles.
Étant donné que les vérifications ultérieures de "does-this-path-match" sur les chemins individuels sous le répertoire entraîneraient le filtrage de ces chemins supplémentaires, la seule différence par rapport à l'utilisation de la mauvaise fonction est un calcul inutile.
Le deuxième de ces mauvais appels à do_match_pathspec()
a été impliqué -- soit par mouvement direct, soit par copie+édition -- dans un certain nombre de refontes ultérieures.
Voir les commits
-
777b420347 ("
dir
: synchroniser treat_leading_path()
y read_directory_recursive()
", 2019-12-19, Git v2.25.0-rc0 -- fusionner )
-
8d92fb2927 ("
dir
: remplacer l'algorithme exponentiel par un algorithme linéaire", 2020-04-01, Git v2.27.0-rc0 -- fusionner figurant sur la liste des lot n° 5 )
-
95c11ecc73 ("Corriger les erreurs
fill_directory()
API ; make it only return matches", 2020-04-01, Git v2.27.0-rc0 -- fusionner figurant sur la liste des lot n° 5 )
Le dernier a introduit l'utilisation de do_match_pathspec()
sur un fichier individuel, ce qui a eu pour effet de renvoyer des chemins d'accès individuels qui n'auraient pas dû l'être.
Le problème de l'appel do_match_pathspec()
au lieu de match_pathspec()
c'est que tout motif nié, tel que :!unwanted_path
sera ignorée .
Ajouter un nouveau match_pathspec_with_flags()
pour répondre aux besoins de spécifier des drapeaux spéciaux tout en continuant à vérifier correctement les motifs niés, ajoutez un gros commentaire au-dessus de do_match_pathspec()
pour éviter que d'autres n'en fassent un usage abusif, et corriger les personnes qui font actuellement appel aux services de l'Union européenne. do_match_pathspec()
pour utiliser à la place soit match_pathspec()
o match_pathspec_with_flags()
.
Enfin, il convient de noter que DO_MATCH_LEADING_PATHSPEC
doit faire l'objet d'une attention particulière lorsqu'il s'agit de travailler avec des DO_MATCH_EXCLUDE
.
Le point de DO_MATCH_LEADING_PATHSPEC
est que si nous avons un chemin d'accès comme
*/Makefile
et nous vérifions un chemin de répertoire comme
src/module/component
que nous voulons considérer comme une correspondance, de sorte que nous recourons à la récursivité dans le répertoire parce qu'il puede ont un fichier nommé Makefile
quelque part en dessous.
Cependant, lorsque nous utilisons un motif d'exclusion, c'est-à-dire lorsque nous avons un chemin d'accès tel que
:(exclude)*/Makefile
nous ne voulons PAS dire qu'un chemin de répertoire comme
src/module/component
est une correspondance (négative).
Bien qu'il y ait puede soit un fichier nommé Makefile
quelque part sous ce répertoire, il peut y avoir d'autres fichiers et nous ne pouvons pas exclure d'emblée tous les fichiers de ce répertoire ; nous devons procéder à une récursivité et vérifier ensuite les fichiers individuellement.
Ajuster le DO_MATCH_LEADING_PATHSPEC
la logique n'est activée que pour les chemins d'accès positifs.