Git фильтры очистки и размытия ничего не делают

Я определил фильтры smudge и clean для моего репозитория git. Я тестировал сценарии отдельно, и я уверен, что они работают правильно.

Но когда я git commit && git push, удаленная версия не фильтруется.

Что я делаю неправильно? Кроме того, есть ли способ проверить, работает ли фильтр, не нажимая его в удаленный репозиторий?

Репозиторий выглядит следующим образом:

zsh/
|- zshrc
git/
|- gitconfig
.gitattributes
.gitconfig
config
zshrc-clean.zsh
zshrc-smudge.zsh
gitconfig-clean.zsh
gitconfig-smudge.zsh

zsh/zshrc

export HOMEBREW_GITHUB_API_TOKEN = abcdefg

git/gitconfig

[user]
    email = [email protected]

.gitattributes

zsh/zshrc   filter=zshrc
git/gitconfig   filter=gitconfig

.gitconfig

[filter "zshrc"]
    clean = zsh zshrc-clean.zsh
    smudge = zsh zshrc-smudge.zsh
[filter "gitconfig"]
    clean = zsh gitconfig-clean.zsh
    smudge = zsh gitconfig-smudge.zsh

config

git:user:email = [email protected]
zsh:HOMEBREW_GITHUB_API_TOKEN = abcdefg

configuration-scripts/gitconfig-clean.zsh

sed '/email/ s/= .*/= REPLACEME:git:user:email/' /dev/stdin

gitconfig-smudge.zsh

user_email=$(sed -n '/git:user:email/ { s/.* = //; p; }' ~/dotfiles/config)
sed "s/REPLACEME:git:user:email/$user_email/" /dev/stdin

zshrc-clean.zsh

sed '/export HOMEBREW_GITHUB_API_TOKEN/ s/=.*/=REPLACEME:zsh:HOMEBREW_GITHUB_API_TOKEN/' /dev/stdin

zshrc-smudge.zsh

HOMEBREW_GITHUB_API_TOKEN=$(sed -n '/HOMEBREW_GITHUB_API_TOKEN/ { s/.* = //; p; }' ~/dotfiles/config)
sed "s/REPLACEME:zsh:HOMEBREW_GITHUB_API_TOKEN/$HOMEBREW_GITHUB_API_TOKEN/" /dev/stdin

Проверить фильтры

zsh zshrc-clean.zsh < zsh/zshrc > zshrc-temp
cat zshrc-temp
zsh zshrc-smudge.zsh < zshrc-temp

zsh gitconfig-clean.zsh < git/gitconfig > gitconfig-temp
cat gitconfig-temp
zsh gitconfig-smudge.zsh < gitconfig-temp

Ответы

Ответ 1

Из видимой информации я могу только предположить, что проблема заключается в попытке настроить фильтры очистки и смазывания в неправильном месте.
Я вижу строки в файле .gitconfig, но если он также не является домашним каталогом, это не то же самое, что .git/config, где Git ищет их.

Попробуйте выполнить эту команду, чтобы увидеть, видит ли Git фильтр:

$ git config filter.zshrc.clean
zsh zshrc-clean.zsh

Если вы ничего не видите, фильтр на самом деле не настроен. Вы можете использовать git config filter.zshrc.clean "zsh zshrc-clean.zsh" вместо редактирования файла конфигурации вручную.

К сожалению, если в фактической конфигурации Git отсутствует фильтр, упомянутый в .gitattributes, он молча игнорируется.

Вот прямой способ проверить, вызывается ли фильтр при добавлении нового или измененного файла (удалить и повторно добавить, если он уже находится в индексе); Linux-только:

$ strace -qqqqqqq -fe execve -e signal=none git add  zsh/zshrc
execve("/home/vi/bin/git", ["git", "add", "zsh/zshrc"], [/* 29 vars */]) = 0
[pid  7061] execve("/bin/sh", ["/bin/sh", "-c", "zsh zshrc-clean.zsh", "zsh zshrc-clean.zsh"], [/* 31 vars */]) = 0
[pid  7062] execve("/usr/bin/zsh", ["zsh", "zshrc-clean.zsh"], [/* 31 vars */]) = 0
[pid  7063] execve("/bin/sed", ["sed", "/export HOMEBREW_GITHUB_API_TOKE"..., "/dev/stdin"], [/* 31 vars */]) = 0

Можно проверить полученный blob после добавления:

$ git ls-files -s
100644 4138315597d69f0da1deae1b6eff0c30dc447e9c 0   zsh/zshrc
$ git cat-file blob 4138315597d69f0da1deae1b6eff0c30dc447e9c
export HOMEBREW_GITHUB_API_TOKEN =REPLACEME:zsh:HOMEBREW_GITHUB_API_TOKEN

Если подозрительная проблема на самом деле находится в .gitattributes, вы можете проверить, действительно ли атрибут применяется к файлу:

$ git check-attr -a zsh/zshrc 
zsh/zshrc: filter: zshrc

Чтобы получить дополнительную помощь, вы можете:

  • Укажите git --version и операционную систему;
  • Если возможно, опубликуйте и соедините весь или частично каталог проекта (включая .git) или попробуйте воспроизвести сбой с фильтром в каком-то простом тестовом репозитории (который может быть опубликован).
  • Попробуйте настроить (или проверить настройку) и полностью использовать фильтры с консоли и включить весь вывод в вопрос.

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