无法从提交中删除文件
Can't remove file from commit
Context:我正在尝试从 git 中删除一些文件,因为我在上面保存了我的机器学习模型的检查点,但是当我做 hyper使用 optuna 进行参数优化,并通过在目录检查点内为每个试验创建一个单独的目录来保存每个试验的检查点(这是我可能会在代码上更改的内容,因为文件太多,我只需要最好的试验)它超过了 git 推的时候限制。检查点文件夹的第一次出现是在 14 次提交之前,我之前已经推送过,但现在它超过了 gits 大小限制
问题:我无法从存储库中删除文件。我尝试了以下方法:
-
git reset --hard @~14
git rm -r --cached path/to/checkpoints
git commit --ammend
git reset --hard last_commit
-
git reset --hard @~14
git rm -rf --cached --ignore-unmatch path/to/checkpoints
git commit --ammend
git reset --hard last_commit
-
git filter-branch --index-filter "git rm -rf --cached --ignore-unmatch path/to/checkpoints" HEAD
结果:当我执行 git reset --hard @~14
时,检查点文件夹仍然存在,而当我执行 git push --force origin master
时,它不起作用,我认为它仍然存在大小限制,因为我无法删除文件但现在连接失败(我已经尝试更改 gits post 缓冲区以查看它是否解决了连接问题)
如果您需要从现有提交中删除大文件,上面显示的三个命令序列中唯一一个可以工作的是第三个(使用git filter-branch
).这样做的原因是:
git reset --hard <last-commit-hash-ID>
恢复你试图撤消的旧提交,所以方法#1 和#2 做了一些工作,然后丢弃完成的工作,让你回到糟糕的状态你以前有过。
你没有提到的是实际问题。你说:
it exceeded git limit when pushing
我不确定这里的代词it指的是什么。 Git 自己的内部限制是千兆字节(Git 的旧版本)和 more-than-terabytes(新版本),所以这不能是 Git限制。也许您指的是 GitHub 限制:。或者您可能指的是其他限制。
值得注意的是,GitHub 至少在默认情况下永远不会丢弃 任何 提交,即使是那些无法从任何引用名称访问的提交。 (这是因为 GitHub 将在分叉之间共享存储。他们不跟踪哪些分叉可能共享哪些内部 Git 对象;相反,他们假设如果某些 Git 对象$obj
存在于您的存储库中,它可能正在被某些 fork 使用,因此即使 您的[=] 也永远不会丢弃 $obj
37=] fork 不再使用它。理论上,GitHub 可以 运行 对所有共享基础存储库的 fork 进行大规模 GC 来纠正这个问题,但这可能比节省的成本更多。)
无论如何,清理大文件的方法很多,包括你提到的filter-branch方法,新奇的, and of course the old standby called The BFG.
Context:我正在尝试从 git 中删除一些文件,因为我在上面保存了我的机器学习模型的检查点,但是当我做 hyper使用 optuna 进行参数优化,并通过在目录检查点内为每个试验创建一个单独的目录来保存每个试验的检查点(这是我可能会在代码上更改的内容,因为文件太多,我只需要最好的试验)它超过了 git 推的时候限制。检查点文件夹的第一次出现是在 14 次提交之前,我之前已经推送过,但现在它超过了 gits 大小限制
问题:我无法从存储库中删除文件。我尝试了以下方法:
-
git reset --hard @~14 git rm -r --cached path/to/checkpoints git commit --ammend git reset --hard last_commit
-
git reset --hard @~14 git rm -rf --cached --ignore-unmatch path/to/checkpoints git commit --ammend git reset --hard last_commit
-
git filter-branch --index-filter "git rm -rf --cached --ignore-unmatch path/to/checkpoints" HEAD
结果:当我执行 git reset --hard @~14
时,检查点文件夹仍然存在,而当我执行 git push --force origin master
时,它不起作用,我认为它仍然存在大小限制,因为我无法删除文件但现在连接失败(我已经尝试更改 gits post 缓冲区以查看它是否解决了连接问题)
如果您需要从现有提交中删除大文件,上面显示的三个命令序列中唯一一个可以工作的是第三个(使用git filter-branch
).这样做的原因是:
git reset --hard <last-commit-hash-ID>
恢复你试图撤消的旧提交,所以方法#1 和#2 做了一些工作,然后丢弃完成的工作,让你回到糟糕的状态你以前有过。
你没有提到的是实际问题。你说:
it exceeded git limit when pushing
我不确定这里的代词it指的是什么。 Git 自己的内部限制是千兆字节(Git 的旧版本)和 more-than-terabytes(新版本),所以这不能是 Git限制。也许您指的是 GitHub 限制:
值得注意的是,GitHub 至少在默认情况下永远不会丢弃 任何 提交,即使是那些无法从任何引用名称访问的提交。 (这是因为 GitHub 将在分叉之间共享存储。他们不跟踪哪些分叉可能共享哪些内部 Git 对象;相反,他们假设如果某些 Git 对象$obj
存在于您的存储库中,它可能正在被某些 fork 使用,因此即使 您的[=] 也永远不会丢弃 $obj
37=] fork 不再使用它。理论上,GitHub 可以 运行 对所有共享基础存储库的 fork 进行大规模 GC 来纠正这个问题,但这可能比节省的成本更多。)
无论如何,清理大文件的方法很多,包括你提到的filter-branch方法,新奇的