2011-11-08 1 views
3

Je veux utiliser l'englobement étendu dans un "filtre d'index", par ex.Comment activer les options de shell dans git?

git filter-branch --index-filter "git rm --cached --ignore-unmatched Modules/!(ModuleA|ModuleB)" 

mais je reçois une erreur:

eval: line 336: syntax error near unexpected token `('

J'ai déjà essayé:

git filter-branch --index-filter "shopt -s extglob && git rm --cached 
--ignore-unmatched Modules/!(ModuleA|ModuleB)" 

La question générale est: comment puis-je activer les options shell spécifiques pour le shell utilisé pour évaluer ces expressions?

Répondre

1

Vous pouvez contourner le problème en ayant votre shell invoquer git filter-branch évaluer le glob pour vous (en supposant que vous activé extglob là):

git filter-branch --index-filter "git rm --cached --ignore-unmatch $(ls -xd Modules/!(ModuleA|ModuleB))" 

Mise à jour: Vous devez fournir des paramètres à ls: -x pour séparer les entrées par espace au lieu de la nouvelle ligne et -d pour imprimer le nom du répertoire au lieu de son contenu. Pour plus d'une poignée de fichiers, vous devrez peut-être ajouter -w 1000 (ou un nombre similaire) pour faire ls assumer un terminal très large et adapter tout sur une seule ligne.

+0

ne semble pas fonctionner. il trouve les fichiers qui sortent et lance des erreurs sur ceux-ci. – robdodson

+0

@robdodson Quelles sont les erreurs que vous voyez? – kynan

+1

J'ai couru 'git filtre-branche --index-filtre" git rm --cache --ignore-unmatch $ (ls application /! (Services | modules)) "'. Il y a un message d'erreur pour chaque fichier ou répertoire qui ne correspond pas à la commande $ (ls ...). Par exemple: "/ usr/lib/git-core/git-filtre-branche: 51: eval: scripts: non trouvé". "scripts" est un répertoire dans/application. –

Questions connexes