git删除某条记录的大文件提交
由于git误提交了个大文件(>1G),虽然删除了,但是提交记录还在,导致出发了git大文件警告。
需求:找到提交大文件的记录,删除提交的大文件。
针对所有分支删除该次提交的大文件:
git filter-branch --index-filter 'git rm --cached --ignore-unmatch "DONS/MemoryCaptures/Snapshot-638413670716915937.snap"' --prune-empty -- --all
针对memory_swap_longlog分支删除该次提交的大文件
git filter-branch --index-filter 'git rm --cached --ignore-unmatch "DONS/MemoryCaptures/Snapshot-638413670716915937.snap"' --prune-empty -- memory_swap_longlog
效果:
之前这里有个大文件提交记录
chatGPT解释:
git filter-branch 是 Git 提供的一个强大工具,用于对 Git 仓库的历史进行重写。在这个命令中,你使用 --index-filter 选项指定了一个 shell 命令,该命令将应用于每个提交的索引(暂存区)。具体来说,这个命令将使用 git rm --cached --ignore-unmatch "DONS/MemoryCaptures/Snapshot-638413670716915937.snap" 作为索引筛选器。
让我解释一下这个命令的各个部分:
git filter-branch: 这是执行历史重写的 Git 命令。
--index-filter: 这个选项指定一个 shell 命令,该命令将被应用于每个提交的索引(暂存区)。
'git rm --cached --ignore-unmatch "DONS/MemoryCaptures/Snapshot-638413670716915937.snap"': 这是作为索引筛选器的命令。它使用 git rm 命令从索引中删除指定的文件,而 --cached 选项表示只从索引中删除,而不会删除工作目录中的实际文件。--ignore-unmatch 选项表示如果文件不存在,则继续执行,不报错。"DONS/MemoryCaptures/Snapshot-638413670716915937.snap" 是你要删除的大文件的路径。
--prune-empty: 这个选项表示在删除文件后,如果提交变为空(即没有任何变化),则删除这个提交。
--all: 这个参数表示对所有分支进行操作。
综合起来,这个命令的目的是删除历史记录中包含指定大文件的提交,并清理这些提交对应的索引。这是一个强大而有影响的操作,确保在执行之前备份你的仓库。同时,强制推送时要确保协作者知悉并同意,因为这会修改共享的历史。