我的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'
答案 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
的提交。
现在尝试推动。如果它仍然失败,那意味着您可能需要修复其他提交,然后事情可能会更多地涉及。