从某些git提交中删除文件,同时保持本地版本不变

时间:2018-12-11 12:05:12

标签: git github git-lfs

情况如下:git存储库中有一个文件A.out,该文件随着时间的推移而增长,现在变得太大而无法推送到github。我只是在变大之后才意识到后面的几次提交,所以这就是仓库的样子:

  • COMMIT5(HEAD)包含A.out超过100mb
  • COMMIT4不包含A.out
  • COMMIT3的A.out确实超过了100mb
  • COMMIT2(来源/ HEAD)不包含A.out
  • COMMIT1确实包含A.out 超过100mb

COMMIT2是我推送到github的最后一个提交,现在我无法在COMMIT5之后推送。

  

我如何从提交3和4中删除A.out,同时在本地将其保持为最新的> 100mb版本(并且从git中取消跟踪)?

编辑:该问题源自github上的大文件问题,这种特定情况可能可以按照How to import git repositories with large files?(由@phd指出)中的说明进行处理。但是,上述问题当然与所涉及的文件大小无关。在我的特定情况下,git版本太旧,当前无法支持git-lfs,但我不想等到服务器版本更新后。

2 个答案:

答案 0 :(得分:2)

git rebase -i HEAD〜4 //为最近的4次提交重新设置git历史记录

它将显示这4个提交的列表。如果要更改远程历史记录(不推荐),则可以选择编辑commit3甚至commit2

在重定commit3的同时,只需将A.out添加到.gitignore。 添加它以提交并继续变基。

如果您以前没有使用过git rebase,建议您先熟悉它

答案 1 :(得分:2)

我假设您当前所在的分支的名称为“ master”

  1. 将a.out复制到git repo之外的文件夹中
  2. git checkout -b new-branch COMMIT2
  3. 将.out添加到您的.gitignore中,然后运行git rm a.out。提交这些更改
  4. git checkout master
  5. git rebase new-branch -i

这将导致一些重新配置冲突,因为您要重新建立(从master)的提交包含a.out,而您重新建立基础的分支(新分支)已经使a.out成为未跟踪的文件

在每次提到a.out的冲突中,先运行git rm a.out,然后运行git rebase --continue进行重新定位

此过程结束时,您可以安全地使用git branch -d new-branch删除新分支,并从git repo外部复制a.out。