为什么git lfs迁移不跟踪所有pdf文件?

时间:2019-09-10 07:57:35

标签: git git-lfs

预先注意git lfs migrate import --include="*.pdf"的工作方式是git lfs ls-files显示e6521dbea0 - large180m.pdf(我想)。但是我还是不明白会发生什么。


我需要使用git lfs,并且在C:/Temp/(在Windows上)中创建了一个测试文件夹,以检查一切是否正常。不幸的是,它不是:git lfs ls-files不列出任何文件!见下文...

({small.txtsmall2.txt是空的文本文件,large180m.pdf是具有180 MB的“大” pdf)

这是怎么了?我遵循了here的指示:

SQC@N6812 MINGW64 /c/Temp
$ ls C:/Temp/*.pdf
C:/Temp/large180m.pdf

SQC@N6812 MINGW64 /c/Temp
$ git init
Initialized empty Git repository in C:/Temp/.git/

SQC@N6812 MINGW64 /c/Temp (master)
$ git add .

SQC@N6812 MINGW64 /c/Temp (master)
$ git commit -m "Initial commit including large file"
[master (root-commit) 035a6ca] Initial commit including large file
 3 files changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 large180m.pdf
 create mode 100644 small.txt
 create mode 100644 small2.txt

SQC@N6812 MINGW64 /c/Temp (master)
$ git status
On branch master
nothing to commit, working tree clean

SQC@N6812 MINGW64 /c/Temp (master)
$ git lfs migrate import --include="C:/Temp/*.pdf"
migrate: Fetching remote refs: ..., done
migrate: Sorting commits: ..., done
migrate: Rewriting commits: 100% (1/1), done
  master        035a6ca083c3300bf33b5e399a547e8141daeb05 -> 53861996e1fe34a82e9b4e1f7b951266b250c4de
migrate: Updating refs: ..., done
migrate: checkout: ..., done

SQC@N6812 MINGW64 /c/Temp (master)
$ git reflog expire --expire-unreachable=now --all

SQC@N6812 MINGW64 /c/Temp (master)
$ git gc --prune=now
Counting objects: 5, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (4/4), done.
Writing objects: 100% (5/5), done.
Total 5 (delta 0), reused 0 (delta 0)

SQC@N6812 MINGW64 /c/Temp (master)
$ git lfs track
Listing tracked patterns
    C:\Temp\*.pdf (.gitattributes)

SQC@N6812 MINGW64 /c/Temp (master)
$ git lfs ls-files

注意:最后,lfs应该在所有子文件夹中跟踪pdf

来自git lfs env

git-lfs/2.3.4 (GitHub; windows amd64; go 1.8.3; git d2f6752f)
git version 2.16.2.windows.1

LocalWorkingDir=C:\Temp
LocalGitDir=C:\Temp\.git

2 个答案:

答案 0 :(得分:1)

您的问题是您通往git lfs migrate import的道路。您提供的路径必须适合.gitattributes文件,这意味着必须相对于存储库的根目录指定该路径。您提供了一个绝对路径,它告诉Git LFS匹配存储库根目录下一个名为Temp的子目录C:中的所有PDF文件。这样的目录在Windows上可能不存在,但在Unix系统上可能存在。

相反,您只想简单地将模式指定为*.pdf,这会影响存储库中的所有PDF文件,无论它们位于何处。

此外,如果您有多个分支,甚至没有,则通常都希望迁移所有分支,因此应传递--everything。因此,您的调用应类似于git lfs migrate import --everything --include="*.pdf"

答案 1 :(得分:0)

@ bk2204的answer says您的问题是输入git lfs migrate的路径。您提供的路径必须适合.gitattributes文件,这意味着它必须 相对于存储库的根目录进行指定。

不能夸大其词。使用Git for Windows 2.28.0,我尝试使用类似的命令

find . -path ./.git -prune -false -o -size +49M -print0 | xargs -r0t -n1 -I{} git lfs migrate import --everything --verbose --include "{}"

添加所有足以使Github向LFS投诉的文件。该命令运行并似乎成功,历史记录被重写,.gitattributes被更新,等等。实际上,.gitattributes被正确地 更新了。

无法正常工作的是,没有将大文件移入LFS。原来问题出在路径的./foo/bar/mega.csv的find输出中。 git lfs命令接受了这一点,在更新.gitattributes之前剥离了前导./,但实际上并未将文件移入LFS。更改为

find . -path ./.git -prune -false -o -size +49M -printf '%P\0' | xargs -r0t -n1 -I{} git lfs migrate import --everything --verbose --include "{}"

使其有效。

希望我能节省一些时间和沮丧的人。

偶然地,

git lfs ls-files
git show HEAD:foo/bar/mega.csv

有助于确定LFS是否已正确设置。