Что не так с этим git smudge / clean filter? - PullRequest
7 голосов
/ 21 марта 2011

Я хочу применить этот фильтр в моем git-репозитории, чтобы удалить раздел из файла решения во время извлечения и добавить этот раздел во время фиксации.

Это раздел, который я хочу удалить или добавить:

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

Я настроил этот фильтр в моем .git / info / attribute

*. Sln filter = SourceControlProvider

и я добавил эти команды в мою конфигурацию

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

Ну, это не работает. Что я сделал не так?

ankhsvnsection - это текстовый файл, который находится в том же каталоге, что и файл * .sln

1 Ответ

17 голосов
/ 22 марта 2011

Я вижу несколько проблем здесь:

  1. У вас есть % в конце обоих фильтров.
    Это не имеет специального значения и будет передано в качестве дополнительного аргументав sed , что, вероятно, приведет к ошибке (если у вас нет файла с именем %).
    Фильтры должны быть «потоковыми» (читать из stdin и записывать в stdout).Их определение может включать %f, но его не следует рассматривать как файл для чтения или записи;Git выполняет эту часть, фильтры должны просто читать из стандартного ввода и писать в стандартный вывод.

  2. Ваш чистый фильтр пытается перенаправить стандартный ввод из %f.
    Входные данные уже будут включеныstdin, нет необходимости перенаправлять.

  3. Программа sed в чистом фильтре использует команду r для доступа к другому файлу.
    Фильтры кажутсязапускаться из корня рабочего дерева, но я не уверен, гарантировано ли это.

  4. Команда sed в чистом фильтре использует -n.Его единственным выводом будет содержимое файла ankhsvnsection (при условии, что вход имеет строку Global).

  5. Некоторые версии sed (по крайней мере,(старая) версия BSD в Mac OS X) не допускает пробелов после имени файла команды r (то есть пробела после ankhsvnsection в программе sed чистого фильтра).

После добавления, изменения или удаления фильтра вам, вероятно, потребуется коснуться , изменить или удалить файлы рабочего дерева, прежде чем Git применит фильтр.Индекс Git записывает время модификации файлов рабочего дерева;если они не изменились, то Git преобразует git checkout -- file и git add file в неработоспособность.

Если вы хотите увидеть фактическое содержимое индекса (например, чтобы проверить, что произвел чистый фильтр), вы можете использовать git show :0:path/from/repo/root/to/file.Обычно вы не можете использовать git diff для этого, так как он также применяет фильтры.

Они работали для меня:

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