Question

Je souhaite appliquer ce filtre dans mon référentiel GIT pour supprimer une section d'un fichier de solution pendant la caisse et ajouter cette section pendant la validation.

C'est la section que je souhaite supprimer ou ajouter:

GlobalSection(SubversionScc) = preSolution
    Svn-Managed = True
    Manager = AnkhSVN - Subversion Support for Visual Studio
EndGlobalSection

J'ai configuré ce filtre dans mon .git / info / attributs

* .sln Filter = SourceControlProvider

Et j'ai ajouté ces commandes à ma configuration

$ git config filter.SourceControlProvider.smudge "sed -e '/GlobalSection(SubversionScc)/,/EndGlobalSection/d' %"
$ git config filter.SourceControlProvider.clean "sed -n -e '/^Global$/ r ankhsvnsection ' < %"

Eh bien, cela ne fonctionne pas. Qu'est ce que j'ai mal fait?

AnkhsvnSection est un fichier texte qui se trouve dans le même répertoire que le fichier * .sln

Était-ce utile?

La solution

Je vois quelques problèmes ici:

  1. Tu as % à la fin des deux filtres.
    Cela n'a pas de sens particulier et sera passé comme un argument supplémentaire sed, qui générera probablement une erreur (sauf si vous avez un fichier nommé %).
    Les filtres doivent être «en streaming» (lire à partir de stdin et écrire à stdout). Leur définition peut inclure %f, mais il ne doit pas vraiment être traité comme un fichier à lire ou à écrire; Git fait cette partie, les filtres devraient simplement lire à partir de stdin et écrire à stdout.

  2. Votre filtre propre essaie de rediriger le stdin %f.
    Les données d'entrée seront déjà sur STDIN, il n'est pas nécessaire de rediriger.

  3. La sed Le programme dans le filtre propre utilise le r commande pour accéder à un autre fichier.
    Les filtres semblent être exécutés à partir de la racine de l'arborescence de travail, mais je ne sais pas si cela est garanti.

  4. La sed Commande dans le filtre Clean utilise -n. Sa seule sortie sera le contenu du ankhsvnsection fichier (en supposant que l'entrée a un Global ligne).

  5. Quelques versions de sed (Au moins l'ancienne version BSD dans Mac OS X) ne permettez pas d'espace blanc après le nom de fichier du r commande (c'est-à-dire l'espace après ankhsvnsection dans le filtre propre sed programme).

Après avoir ajouté, modifié ou supprimé un filtre, vous devrez probablement toucher, modifiez ou supprimez vos fichiers d'arborescence fonctionnels avant que Git applique le filtre. L'index de Git enregistre le temps de modification des fichiers d'arborescence fonctionnels; S'ils n'ont pas changé, alors Git se traduira git checkout -- file et git add file dans un no-opératoire.

Si vous souhaitez voir le contenu réel de l'index (par exemple pour vérifier ce que le filtre propre produit), vous pouvez utiliser git show :0:path/from/repo/root/to/file. Vous ne pouvez généralement pas utiliser git diff Pour cela, car il applique également les filtres.

Ceux-ci ont fonctionné pour moi:

git config filter.SourceControlProvider.smudge "sed -e '/GlobalSection(SubversionScc)/,/EndGlobalSection/d'"
git config filter.SourceControlProvider.clean "sed -e '/^Global\$/ r ankhsvnsection'"
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top