我正在使用一个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
(为了更好地阅读,我添加了转义换行符,并更改了单词以匹配简单。在原始版本中,不可能发生碰撞。
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.autocrlf
为true,.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上使用裸存储库对我有用。