git 过滤器不是"取消修改"文件



我正在使用一个IDE,它在某些生成但强烈需要的库文件中生成一个版本。因此,如果我想使用具有多个版本的库,或者我看到大量实际上毫无意义的更改,则会出现一个问题。

总结:我想忽略一行一个或多个文件,我认为 git 的过滤器是正确的方法。我能够毫无问题地grep相关行,因为人们可能会看到进一步阅读。

长话短说,我设置了一个 git 过滤器来恢复对头文件中版本的任何修改。(请注意,此文件中可能会有不同的相关修改。

[filter "ignore-version"]
smudge = cat %f || cat
clean  = git ls-files %f --error-unmatch >&- 2>&- 
&& sed "/version/c $(git show HEAD:%f | grep version)" || cat

(为了更好地阅读,我添加了转义换行符,并更改了单词以匹配简单。在原始版本中,不可能发生碰撞。

  1. git ls-files检查文件是否已在存储库中(当前为HEAD)

1.1 如果存在,sed将做脏活,用已经跟踪的线替换整条线

1.2 如果没有,cat什么也不做,只能继续(这应该确保尚未跟踪的文件不会丢失)

到目前为止,它有效。(我可以接受过滤器静默地将所有CRLF转换为LF的事实......

问题:固定文件被标记为由 git 修改,尽管存储库的最新文件和过滤版本二进制相等。我使用kdiff作为单独的工具对此进行了检查。


编辑 1:以下是一些输出,显示了两个文件版本的相等性:

$ git show HEAD:file.txt | md5sum
9f95c28cebe4f45b8efb7b0ae64dfa56
$ cat file.txt | md5sum
894e7d1b28180b7a193bf3cdd6ceaacb
$ cat file.txt | git ls-files file.txt --error-unmatch >&- 2>&- 
&& sed "/version/c $(git show HEAD:file.txt | grep version)" 
|| cat | md5sum
9f95c28cebe4f45b8efb7b0ae64dfa56

编辑 2:此外,差值的输出...

$ git diff file.txt
warning: LF will be replaced by CRLF in file.txt.
The file will have its original line endings in your working directory.

请注意,此文件的签入版本仅包含上次提交的LF。另请注意,设置core.autocrlftrue,.gitattributes文件中只有筛选器规范。

终于,我解决了。问题文件处于奇怪的状态,似乎签出版本具有 unix 样式的行结尾,这与 git 配置有关不正确(签出窗口样式,提交 unix 样式)。暂此特定文件后,它立即从暂存区域中删除,没有任何提及,现在被视为未更改。所以我认为 git 在暂存期间清理了工作目录文件(行尾),现在它可以工作了。

对不起,噪音。


完全检查问题的步骤:

git init
echo "version=0.1" > file.txt
echo "*.txt filter=ignore-version" > .gitattributes
git config --local filter.ignore-version.clean 'git ls-files %f --error-unmatch >&- 2>&- 
&& sed -b "/version/c $(git show HEAD:%f | grep version)" || cat'
git config --local filter.ignore-version.smudge 'cat %f || cat'
git add file.txt .gitattributes
git commit -m "initial commit"
# -----
echo "version=0.2" > file.txt
git status

状态不应报告任何更改。它在Linux和Windows上使用裸存储库对我有用。

最新更新