如何使用git-lfs跟踪具有正确行结束标准化的文本文件?

时间:2016-11-24 22:09:40

标签: git gitattributes git-lfs

我有一个存储库,我想添加大文本数据文件。由于它们的数量和大小(在某些情况下可能高达约100MB),我想用git-lfs跟踪这些文件。

我已使用git lfs track data.txt添加了此类文件,并将-text文件中的默认text=auto(指定二进制文件)更改为.gitattributes(如git-scm's gitattributes documentation中所述。这给了我.gitattributes看起来像:

data.txt filter=lfs diff=lfs merge=lfs text=auto

只是为了确定,我有refreshed the repository。即便如此,似乎仍然将文件作为二进制对象进行跟踪,并且相应地在结账时不应用行结束转换过滤器(即文件正在检查时,原始行结尾已检查 - in with)。

我还尝试使用text=crlf(以及变体text eol=crlf)获得相同的结果。我看过很多关于使用git-lfs的文档和教程,但它们似乎都是为了跟踪二进制文件(例如*.binimagesaudio files,... 。)

有没有办法使用git-lfs将文件作为大文本文件进行跟踪(并将行尾标准化为常规文本文件)?

我目前在Windows 7平台上使用git-lfs 1.5.2和git用于Windows 2.10.2(64位版本),core.autocrlf=true配置。

1 个答案:

答案 0 :(得分:2)

经过对git-scm's gitattributes的更多阅读以及一些修补,我通过定义基于git-lfs自己的过滤器的自定义过滤器来实现此功能(我在{{ 1}})并使用Jonathan Leffler' s unix-to-dos conversion with sed

~/.gitconfig

然后可用于跟踪具有[filter "textlfs"] clean = sed $'s/$/\\r/' %f | git-lfs clean smudge = git-lfs smudge -- %f | sed $'s/\\r$//' required = true 条目的Windows计算机上的大型文本文件,例如:

.gitattributes

然而,这会强制存储库用户包含此自定义筛选器定义。为方便起见,您可以include it in a custom .gitconfig in your repository(请注意,这需要用户手动将定义包含在data.txt filter=textlfs diff=textlfs merge=textlfs 中)。这应该适用于Windows平台上的用户,但不适合具有不同行结尾的平台上的用户(例如Linux和Mac)。可以使用以下内容构建更复杂的过滤器来处理不同的平台:

git config --local include.path ../.gitconfig

最后,请记住,除非您的大文本文件通常在更新之间发生显着变化,或者它们太大以至于超出文件大小限制(such as GitHub's),否则将这些文本文件作为标准处理可能仍然有利自git can efficiently pack text files以来的文本文件(即没有[filter "textlfs"] clean = (if [ `uname -s` == "Linux" ]; then cat %f; else sed $'s/$/\\r/' %f; fi) | git-lfs clean smudge = git-lfs smudge -- %f | (if [ `uname -s` == "Linux" ]; then cat; else sed $'s/\\r$//'; fi) required = true )。