【问题标题】:Git clean and smudge filters don't do anythingGit clean 和 smudge 过滤器不做任何事情
【发布时间】:2015-11-11 07:47:01
【问题描述】:

我为我的 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 = 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

测试过滤器

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/config)并且干净的过滤器似乎正在工作。这是 7-zip 打包的 base64 编码的测试存储库:sprunge.us/FZTJ。请同时发布您的.git/configgit --version 和操作系统。
  • 注意:如果 Github API 令牌或其他安全信息由于不工作的干净过滤器而被发布,有问题的令牌应该被撤销并重新生成。

标签: git filter git-filter


【解决方案1】:

根据可见信息,我只能假设问题在于尝试在错误的位置配置清洁和涂抹过滤器。
我在.gitconfig 文件中看到了这些行,但除非它也是主目录,否则它与 Git 查找它们的.git/config 不同。

尝试执行这个命令,看看 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

如需进一步帮助,您可以:

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

确保干净过滤器适用于一个文件后,您可以继续使用另一个文件并涂抹过滤器。

【讨论】:

    猜你喜欢
    • 2021-08-28
    • 1970-01-01
    • 1970-01-01
    • 2012-12-26
    • 1970-01-01
    • 2020-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多