Git LFS跳过文件,但是git开始将其推送到repo

时间:2017-11-14 16:30:38

标签: git github version-control git-lfs

我的Github仓库中有一个大文件,我通常使用git lfs上传。 对于较新的提交,我不得不更改文件,但现在推送,git lfs正在跳过该文件,正常的git尝试上传它。当然,这会失败,因为它超过了Github的最大文件大小。 我跑的时候

GIT_TRACE=1 git push

这是输出:

  

trace git-lfs:run_command:'git'version trace git-lfs:run_command:   'git'config -l trace git-lfs:tq:作为批处理队列运行,批处理   大小为100 trace git-lfs:run_command:ssh - git@github.com   git-lfs-authenticate myRepo.git upload   trace git-lfs:HTTP:POST   https://lfs.github.com/myRepo/locks/verify   trace git-lfs:HTTP:200 trace git-lfs:HTTP:   { “我们的”:[], “他们的”:[], “next_cursor”: “”}

     

trace git-lfs:pre-push:refs / heads / master   d7b0e4138403023433894f756d63bdadfabac125 refs / heads / master   683a30586bc68758230da6686fa902d4621b358a trace git-lfs:run_command:   git rev-list --objects d7b0e4138403023433894f756d63bdadfabac125 - not   --remotes = origin - trace git-lfs:run_command:git cat-file --batch trace git-lfs:tq:发送批量为1的批量跟踪git-lfs:ssh cache:   git@github.com git-lfs-authenticate   myRepo.git上传跟踪git-lfs:api:   批处理1文件跟踪git-lfs:HTTP:POST   https://lfs.github.com/myRepo/objects/batch   trace git-lfs:HTTP:200 trace git-lfs:HTTP:   { “对象”:[{ “OID”: “1e24fed72634c9217ce7856d11ee204d38eb154fc90572a8ef047007f2211a6c”, “大小”:246116656}]}   trace git-lfs:tq:启动传输适配器“basic”Git LFS :( 0 of 0   文件,1跳过)0 B / 0 B,234.72 MB跳过
  17:22:37.083227 run-command.c:343 trace:run_command:   'pack-objects'' - all-progress-implied''--revs'' - stdout''--thin'   '--delta-base-offset'' - prog 17:22:37.084316 exec_cmd.c:128
  trace:exec:'git''pack-objects'' - all-progress-implied''--revs'   '--stdout'' - '' - - delta-base-offset'' - prog 17:22:37.088704   git.c:348 trace:内置:git'pack-objects'   ' - all-progress-implied'' - 'evs'' - stdout'' - 'thin'   '--delta-base-offset'' - progress'计数对象:109,完成。三角洲   使用最多4个线程进行压缩。

     

压缩对象:100%   (106/106),完成了。书写对象:100%(109/109),73.55 MiB | 1.81   MiB / s,完成了。总计109(delta 74),重用0(delta 0)远程:   解决增量:100%(74/74),完成53个本地对象。   remote:错误:GH001:检测到大文件。你可能想试试Git   大文件存储 - https://git-lfs.github.com。 remote:错误:跟踪:   e87aee9bcda79c0a788ae345112c9d37 remote:错误:见   http://git.io/iEPt8g了解更多信息。 remote:错误:文件   src / ios / sdk / myLib.framework / Framework为234.72 MB;这个   超过GitHub的文件大小限制为100.00 MB To   git@github.com:myRepo.git! [远程   拒绝]主人 - > master(pre-receive hook拒绝)错误:失败   推动一些参考   'git@github.com:myRepo.git'

1 个答案:

答案 0 :(得分:2)

听起来,在将新版本的文件添加到索引时,并未应用lfs clean过滤器。如果文件名没有改变,那么这可能意味着没有.gitattributes文件将该路径与LFS相关联。 (当你第一次添加文件的旧版本时,从来没有一个人和你以某种方式手动运行清理过滤器;或者有一个但它没有被提交;或者它已被删除或修改以不再与文件匹配的方式;等等......)

并澄清 - 如果文件名确实发生了变化,它可能会更改为与.gitattributes文件中的任何路径都不匹配的内容。因此,您需要更新.gitattributes以匹配新文件名。

使用LFS跟踪暂存文件后,git(在索引和数据库中)看到的是LFS指针文件。因此,即使删除了属性文件,也不会立即导致将大文件上载到repo数据库中。但是如果你重新添加文件(因为你在修改它之后必须这样做)并且当时没有设置属性,那么整个文件将被暂存而不是指针文件。

我认为LFS在上面的跟踪中跳过的是文件的旧版本 - 因为服务器已经有了。这很正常。

但是,你试图推动的承诺并不好;它具有不可逆转地嵌入其中的完整文件。您需要修改(或重新定义或以其他方式重写)包含完整文件的每个提交。幸运的是,由于这会阻止共享提交,因此您应该能够安全地重写它们,而不必担心其他任何人被放入"上游rebase"情况。

总结一下:

确保您有一个.gitattributes文件,该文件将LFS属性分配给与大文件匹配的路径。您应该将此.gitattributes文件添加到索引中。

删除并重新索引新版本的大文件。

git rm --cached path/to/big/file
git add path/to/big/file

如果.gitattributes设置正确,add这次将通过LFS清理过滤器;指针文件将被添加到索引中,并将创建一个新的LFS对象。

git commit --amend

用一个使用LFS的新提交替换嵌入了大BLOB的提交。

现在尝试推动。如果它仍然失败,那意味着您可能需要修复其他提交,然后事情可能会更多地涉及。