忽略提交给git的文件,并将其从历史记录中删除

时间:2017-08-17 10:18:45

标签: git version-control gitignore

当我开始我的项目时,我忘了将某些文件添加到我的.gitignore中,因此提交了我不应该提交的文件。 I ignored the files afterwards as described here.虽然文件仍然存在于我的存储库的历史记录中,但现在我的存储库大小为10GB,但已经发生了损坏!

由于上述原因,我没有推送文件,因此重写历史记录应该没问题。简而言之,我需要做的是重写历史记录,以便之后在存储库中的任何提交中都不存在当前.gitignore中的任何文件。

编辑:有很多小文件对大尺寸有贡献,因此关于如何删除超过特定大小阈值的所有文件的建议副本无法解决此问题。

4 个答案:

答案 0 :(得分:3)

将提交历史记录重置为原始,您可以使用git reset --hard origin/branchname

忽略文件并将其从历史记录中删除,您可以按照以下两个方面进行操作:

1。忽略已经提交给git

的文件
  • .gitignore创建touch .gitignore文件(如果没有)。
  • .gitignore中添加要忽略的文件和文件夹。允许使用通配符。然后提交更改。
  • 忽略已提交历史记录中的文件:

    git rm filename –r --cached git commit

2。完全从提交历史中删除文件

git filter-branch --index-filter 'git rm --ignore-unmatch -r --cached filename' --prune-empty -f -- --all

整理您的本地存储库(您也可以跳过此步骤):

rm -Rf .git/refs/original
rm -Rf .git/logs/
git gc
git prune --expire now

将重写历史记录推送到远程

git push -f --all

答案 1 :(得分:0)

如果在推送这些文件后你有很多提交,我不认为你能找到一个非常好的解决方案,但是它们可以删除。
假设您目前的最新作品位于dev分支 您可以转到最初跟踪这些文件的提交,并在那里为商品创建一个新的分支,比方说fix_dev
我将首先删除您在提交中错误地跟踪的文件,跟随您在问题中引用的SO帖子。之后,我将使用以下命令修改该提交:

git commit --amend -m "Original message with additions"

这将创建原始提交的副本,但它将与原始git历史记录不同。接下来,我会将dev分支的interactive rebase提交到您的fix_dev分支上,将原始未修改的提交保留下来。 这样,您应该最终得到一个版本的存储库,而不会在分支fix_dev中错误地添加该特定提交的文件。如果您添加了不需要的文件,则可以重复此过程 一旦你对新分支的版本感到满意,你可以在那里移动dev分支:

git checkout fix_dev
git branch -f dev
git checkout dev

最后,您需要强制将dev推送到远程存储库以重写历史记录:

git push -f remote dev

答案 2 :(得分:0)

您可以使用交互式变基来执行此操作:-

  1. 选择您要删除文件的最新提交。
  2. 正常删除它们,然后.gitignore提交。
  3. 进行交互式变基,以将删除提交移至要修复的提交之后。
  4. 进行交互式变基以压缩删除及其先前的提交。
  5. 根据需要重复进行其余的提交。

我本以为您可以在一个交互式基准库中完成3和4,但是我发现它导致了冲突。

答案 3 :(得分:-1)

如果您担心存储库大小,我建议采取以下步骤

  
      
  1. 从.gitignore中删除文件。现在你将恢复这些文件。
  2.   
  3. 对所有这些文件进行删除提交
  4.   
  5. 再次更新.gitignore以便其他人不会再次检入
  6.