Git干净和涂抹过滤器什么都不做

sha*_*ker 15 git filter git-filter

我为我的git存储库定义了涂抹和清理过滤器.我单独测试了脚本,我很确定它们正常工作.

但是,当我git commit && git push,远程版本未被过滤.

我究竟做错了什么?此外,有没有办法测试过滤器是否工作而不将其推送到远程存储库?

存储库看起来像:

zsh/
|- zshrc
git/
|- gitconfig
.gitattributes
.gitconfig
config
zshrc-clean.zsh
zshrc-smudge.zsh
gitconfig-clean.zsh
gitconfig-smudge.zsh
Run Code Online (Sandbox Code Playgroud)

zsh/zshrc

export HOMEBREW_GITHUB_API_TOKEN = abcdefg
Run Code Online (Sandbox Code Playgroud)

git/gitconfig

[user]
    email = me@example.com
Run Code Online (Sandbox Code Playgroud)

.gitattributes

zsh/zshrc   filter=zshrc
git/gitconfig   filter=gitconfig
Run Code Online (Sandbox Code Playgroud)

.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
Run Code Online (Sandbox Code Playgroud)

config

git:user:email = me@example.com
zsh:HOMEBREW_GITHUB_API_TOKEN = abcdefg
Run Code Online (Sandbox Code Playgroud)

configuration-scripts/gitconfig-clean.zsh

sed '/email/ s/= .*/= REPLACEME:git:user:email/' /dev/stdin
Run Code Online (Sandbox Code Playgroud)

gitconfig-smudge.zsh

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

zshrc-clean.zsh

sed '/export HOMEBREW_GITHUB_API_TOKEN/ s/=.*/=REPLACEME:zsh:HOMEBREW_GITHUB_API_TOKEN/' /dev/stdin
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

测试过滤器

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
Run Code Online (Sandbox Code Playgroud)

Vi.*_*Vi. 10

从可见信息中我只能假设问题在于尝试在错误的位置配置干净和污迹过滤器.
我在.gitconfig文件中看到了这些行,但除非它也是一个主目录,否则它与.git/configGit查找它们的情况不一样.

尝试执行此命令以查看Git是否看到过滤器:

$ git config filter.zshrc.clean
zsh zshrc-clean.zsh
Run Code Online (Sandbox Code Playgroud)

如果您没有看到任何内容,则实际上并未配置过滤器.您可以使用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
Run Code Online (Sandbox Code Playgroud)

可以在添加后检查生成的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
Run Code Online (Sandbox Code Playgroud)

如果怀疑问题实际存在.gitattributes,您可以检查该属性是否实际应用于该文件:

$ git check-attr -a zsh/zshrc 
zsh/zshrc: filter: zshrc
Run Code Online (Sandbox Code Playgroud)

要获得进一步的帮助,您可以:

  1. 指定git --version和操作系统;
  2. .git如果可能,发布并链接整个或部分项目目录(包括),或尝试使用过滤器在一些简单的测试存储库(可以发布)上重现失败.
  3. 尝试设置(或检查设置)并完全从控制台使用过滤器,并在问题中包含整个输出.

确保清洁过滤器适用于一个文件后,您可以继续使用其他文件和涂抹过滤器.