Git清洁和污迹过滤器不';我什么也不做

Git清洁和污迹过滤器不';我什么也不做,git,filter,git-filter,Git,Filter,Git Filter,我为我的git存储库定义了污迹和清洁过滤器。我单独测试了脚本,我很确定它们工作正常 但是,当我执行git提交和git推送时,远程版本将被取消筛选 我做错了什么?另外,是否有一种方法可以在不将过滤器推送到远程存储库的情况下测试它是否工作 存储库看起来像: zsh/ |- zshrc git/ |- gitconfig .gitattributes .gitconfig config zshrc-clean.zsh zshrc-smudge.zsh gitconfig-clean.zsh gitco

我为我的git存储库定义了污迹和清洁过滤器。我单独测试了脚本,我很确定它们工作正常

但是,当我执行git提交和git推送时,远程版本将被取消筛选

我做错了什么?另外,是否有一种方法可以在不将过滤器推送到远程存储库的情况下测试它是否工作

存储库看起来像:

zsh/
|- zshrc
git/
|- gitconfig
.gitattributes
.gitconfig
config
zshrc-clean.zsh
zshrc-smudge.zsh
gitconfig-clean.zsh
gitconfig-smudge.zsh
zsh/zshrc
git/gitconfig
.gittributes
.gitconfig
config
配置脚本/gitconfig clean.zsh
gitconfig smudge.zsh
zshrc clean.zsh
zshrc smudge.zsh
测试过滤器
zsh zshrc-clean.zshzshrc温度
cat zshrc温度
zsh zshrc-smudge.zshgitconfig-temp
cat配置温度
zsh gitconfig-smudge.zsh
从可见信息中,我只能假设问题在于试图在错误的位置配置清洁和污迹过滤器。
我在
.gitconfig
文件中看到了这些行,但除非它也是主目录,否则它与git查找它们的
.git/config
不同

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

$ git config filter.zshrc.clean
zsh zshrc-clean.zsh
如果没有看到任何内容,则过滤器实际上没有配置。您可以使用git config filter.zshrc.clean“zsh zshrc clean.zsh”而不是手动编辑配置文件

不幸的是,如果实际的git配置中缺少
.gittributes
中提到的过滤器,它将被默默地忽略

这里有一种直接的方法,可以检查在添加新的或更改的文件时是否调用了过滤器(如果它已经在索引中,请删除并重新添加);仅限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
如果可疑问题实际上在
.gittributes
中,则可以检查该属性是否实际应用于文件:

$ git check-attr -a zsh/zshrc 
zsh/zshrc: filter: zshrc
要获得进一步帮助,您可以:

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

  • 在确保一个文件的干净过滤器工作后,您可以继续使用另一个文件和污迹过滤器。

    我已按照您所述创建了存储库(但将
    .gitconfig
    文件的内容附加到
    .git/config
    ),干净过滤器似乎工作正常。以下是由7-zip打包的base64编码测试存储库:。还请发布您的
    .git/config
    git--version
    和操作系统。注意:如果由于无法正常工作的干净筛选器而发布了Github API令牌或其他安全信息,则应撤销并重新生成有问题的令牌。
    git:user:email = me@example.com
    zsh:HOMEBREW_GITHUB_API_TOKEN = abcdefg
    
    sed '/email/ s/= .*/= REPLACEME:git:user:email/' /dev/stdin
    
    user_email=$(sed -n '/git:user:email/ { s/.* = //; p; }' ~/dotfiles/config)
    sed "s/REPLACEME:git:user:email/$user_email/" /dev/stdin
    
    sed '/export HOMEBREW_GITHUB_API_TOKEN/ s/=.*/=REPLACEME:zsh:HOMEBREW_GITHUB_API_TOKEN/' /dev/stdin
    
    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
    
    $ git config filter.zshrc.clean
    zsh zshrc-clean.zsh
    
    $ 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
    
    $ 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
    
    $ git check-attr -a zsh/zshrc 
    zsh/zshrc: filter: zshrc