有一个文件被跟踪git,但现在该文件在.gitignore列表中.
但是,该文件在git status编辑后会一直显示.你怎么强迫git完全忘掉它?
偶尔我会把一个DVD-rip放到一个网站项目中,然后不小心git commit -a -m ...,然后,zap,回购邮件被2.2演出臃肿.下次我做了一些编辑,删除了视频文件,并提交了所有内容,但是历史记录中的压缩文件仍然存储在存储库中.
我知道我可以从那些提交开始分支并将一个分支重新绑定到另一个分支.但是我应该怎么做才能将2个提交合并在一起,以便大文件没有在历史记录中显示并在垃圾收集过程中被清除?
我正在使用我的GitHub帐户上的存储库,这是我偶然发现的一个问题.
node_modules文件夹中在那个例子中,总git repo的大小约为6MB,其中实际代码(除了该文件夹之外的所有代码)只有大约300 KB.
现在我正在寻找的是从git的历史中删除该包文件夹的细节的一种方法,所以如果有人克隆它,他们不必下载6mb的历史记录,他们将获得唯一的实际文件截至上次提交时将为300KB.
我查找了可能的解决方案并尝试了这两种方法
Gist似乎在运行脚本之后起作用,它表明它摆脱了该文件夹,之后它显示了50个不同的提交被修改.但它没有让我推动那些代码.当我试图推它时,它说,Branch up to date但显示50个提交被修改了一个git status.其他两种方法也没有帮助.
现在即使它显示它摆脱了该文件夹的历史记录,当我在我的localhost上检查该repo的大小时,它仍然是大约6MB.(我也删除了refs/original文件夹,但没有看到repo大小的变化).
我要澄清的是,如果有一种方法可以摆脱提交历史(这是我认为发生的唯一事情),而且那些文件git保持假设一个人想要回滚.
让我们说一个解决方案是为此而呈现并应用于我的localhost但不能复制到该GitHub仓库,是否有可能克隆该repo,回滚到第一个提交执行技巧并推送它(或者这是否意味着git将仍然有所有这些提交的历史? - 又名.6MB).
我的最终目标是基本上找到从git中删除文件夹内容的最佳方法,这样用户就不必下载6MB的东西,仍然可能有其他提交从未触及过模块文件夹(那很漂亮)他们中的所有人都在git的历史中.
我怎样才能做到这一点?
(解决了,看到问题正文的底部)现在
寻找这个,我现在拥有的是:
几乎相同的方法,但它们都将对象留在包文件中......坚持.
我尝试了什么:
git filter-branch --index-filter 'git rm --cached --ignore-unmatch file_name'
rm -Rf .git/refs/original
rm -Rf .git/logs/
git gc
Run Code Online (Sandbox Code Playgroud)
包中还有文件,这就是我所知道的:
git verify-pack -v .git/objects/pack/pack-3f8c0...bb.idx | sort -k 3 -n | tail -3
Run Code Online (Sandbox Code Playgroud)
还有这个:
git filter-branch --index-filter "git rm -rf --cached --ignore-unmatch file_name" HEAD
rm -rf .git/refs/original/ && git reflog expire --all && git gc --aggressive --prune
Run Code Online (Sandbox Code Playgroud)
相同...
尝试过的git clone技巧,它删除了一些文件(约3000个)但最大的文件仍然存在...
我在存储库中有一些大的遗留文件,大约200M,我真的不希望它们在那里...而且我不想将存储库重置为0 :(
解决方案:这是摆脱文件的最短路径:
refs/remotes/origin/master一个远程存储库的行,删除它,否则git将不会删除这些文件git verify-pack -v .git/objects/pack/#{pack-name}.idx | sort …