1

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

我已经添加了这样一个文件git lfs track data.txt,并将默认-text(指定二进制文件)更改text=auto.gitattributes文件中(如git-scm 的 gitattributes 文档中所述)。这给了我一个.gitattributes看起来像:

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

可以肯定的是,我已经刷新了存储库。即便如此,该文件似乎仍作为二进制对象进行跟踪,相应地,行尾转换过滤器并未应用于签出(即,文件正在以它被检查的原始行结尾签出-与)。

我也尝试过text=crlf(和变体text eol=crlf),结果相同。我看过许多有关使用的文档和教程,git-lfs但它们似乎都针对跟踪二进制文件(例如*.bin图像音频文件,...)

有没有办法使文件被跟踪为一个大文本文件(并像常规文本文件一样将行尾标准化)git-lfs

我目前使用的是git-lfs1.5.2,并且git是针对 Windows 7 平台上的 Windows 2.10.2(64 位版本)的core.autocrlf=true配置。

4

1 回答 1

3

在阅读了更多git-scm 的 gitattributes和一些修改之后,我能够通过基于git-lfs自己的过滤器(我在 中找到~/.gitconfig)定义自定义过滤器并利用Jonathan Lefflerunix-to-dos来实现此功能转换sed

[filter "textlfs"]
  clean = sed $'s/$/\\r/' %f | git-lfs clean
  smudge = git-lfs smudge -- %f | sed $'s/\\r$//'
  required = true

然后可以使用它来跟踪 Windows 机器上的大型文本文件,其中包含以下.gitattributes条目:

data.txt filter=textlfs diff=textlfs merge=textlfs

但是,这会强制存储库用户包含此自定义过滤器定义。为方便起见,您可以将其包含在存储库的自定义.gitconfig中(请注意,这需要用户手动包含定义git config --local include.path ../.gitconfig)。这应该适用于 Windows 平台上的用户,但不适用于具有不同行尾的平台上的用户(例如 Linux 和 Mac)。可以构建一个更复杂的过滤器来处理不同的平台,例如:

[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

最后,请记住,除非您的大文本文件通常在更新之间发生显着变化或它们太大以至于超出文件大小限制(例如 GitHub 的),否则将这些文本文件作为标准文本文件处理(即没有git-lfs) 因为git 可以有效地打包文本文件

于 2016-12-08T17:51:07.587 回答