Los filters Git clean y smudge no hacen nada

Definí manchas y filters limpios para mi repository de git. Probé las secuencias de commands de forma individual y estoy bastante seguro de que funcionan correctamente.

Pero cuando git commit && git push , la versión remota no se filtra.

¿Qué estoy haciendo mal? Además, ¿hay alguna manera de probar si el filter funciona sin empujarlo a un repository remoto?

El repository se ve así:

 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 = me@example.com 

.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 = me@example.com 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 

Prueba los filters

 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 

A partir de la información visible, solo puedo suponer que el problema está en tratar de configurar filters de limpieza y manchas en el lugar equivocado.
Veo las líneas en el file .gitconfig , pero a less que también sea un directory de inicio, no es lo mismo que .git/config , donde Git las busca.

Intenta ejecutar este command para ver si Git ve el filter:

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

Si no ve nada en su lugar, el filter no está realmente configurado. Puede usar git config filter.zshrc.clean "zsh zshrc-clean.zsh" lugar de editar manualmente el file de configuration.

Desafortunadamente, si un filter mencionado en .gitattributes falta en la configuration actual de git, se ignora silenciosamente.

Aquí hay una forma directa de inspeccionar si el filter se está llamando al agregar un file nuevo o modificado (eliminar y volver a agregar si ya está en el índice); Solo para 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 

Uno puede inspeccionar el blob resultante después de la adición:

 $ 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 

Si el problema sospechado está realmente en .gitattributes , puede verificar si el atributo se aplica realmente al file:

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

Para get ayuda adicional, puede:

  1. Especifique git --version y el sistema operativo;
  2. Publique y vincule el directory completo o parcial del proyecto (incluido .git ), si es posible, o intente reproducir el error con el filter en algún repository de testing simple (que puede publicarse).
  3. Intente configurar (o inspeccionar la configuration) y use filters completamente desde la console e incluya todo el resultado en la pregunta.

Después de asegurarse de que el filter limpio funciona para un file, puede continuar con el otro file y los filters de borrado.