我为我的 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
从可见信息中,我只能假设问题在于尝试在错误的位置配置干净和污迹过滤器。
我看到
.gitconfig
文件中的行,但除非它也是主目录,否则它与 Git 查找它们的 .git/config
不同。
尝试执行此命令来查看 Git 是否看到过滤器:
$ git config filter.zshrc.clean
zsh zshrc-clean.zsh
如果您什么也没看到,则过滤器实际上尚未配置。您可以使用
git config filter.zshrc.clean "zsh zshrc-clean.zsh"
而不用手动编辑配置文件。
不幸的是,如果
.gitattributes
中提到的过滤器在实际的 git 配置中丢失,它会被默默地忽略。
这是一种直接的方法来检查在添加新的或更改的文件时是否正在调用过滤器(如果它已经在索引中,则删除并重新添加);仅限 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
),或者尝试在一些简单的测试存储库(可以发布)上使用过滤器重现失败。确保清洁过滤器适用于一个文件后,您可以继续使用其他文件和涂抹过滤器。