我把以前由 Git 跟踪的文件放在.gitignore 列表中. 但是,文件在编辑后仍然显示在 git 状态。


当前回答

如果你不想使用 CLI 并在 Windows 上工作,一个非常简单的解决方案是使用 TortoiseGit. 它在菜单中有“删除(保持本地)”操作,它工作得很好。

其他回答

BFG 专门用于从 Git 存储库中删除不需要的数据,如大文件或密码,因此它有一个简单的旗帜,将删除任何大历史文件(不属于您的当前文件):‘--strip-blobs-bigger-than’

java -jar bfg.jar --strip-blobs-bigger-than 100M

如果你想按名称指定文件,你也可以这样做:

java -jar bfg.jar --delete-files *.mp4

BFG 比 git 过滤器行业快 10 至 1000 倍,通常更容易使用 - 查看完整使用指示和示例,以获取更多详细信息。

来源:库存大小减少

.gitignore 将防止未跟踪的文件添加(没有添加 -f)到 Git 跟踪的文件集,但是, Git 将继续跟踪已跟踪的任何文件。

要停止跟踪文件,我们必须从指数中删除文件:

git rm --cached <file>

要重新删除文件夹和文件中的所有文件:

git rm -r --cached <folder>

将文件从主审查中删除,将在下一个任务中进行。

警告:虽然这不会从您的本地机器中删除物理文件,但它会在下一个 git 拖动时将从其他开发人员的机器中删除文件。

我用 git filter-branch 完成了这一点,我所使用的准确命令从 man 页面上取出:

警告:此将从您的整个历史中删除文件

git filter-branch --index-filter 'git rm --cached --ignore-unmatch filename' HEAD

这个命令将恢复整个命令历史,在每个命令之前执行 git rm 以便摆脱所指定的文件. 不要忘记在运行命令之前备份它,因为它将失去。

使用 git rm --cached 命令不会回答原始问题:

你怎样要强迫吉特完全忘记(一个文件)?

事实上,这个解决方案会导致文件在运行 git pull 时在存储库的每个其他例子中被删除!

强迫 Git 忘记文件的正确方式是由 GitHub 在这里记录的。

我推荐阅读文档,但基本上:

git fetch --all
git filter-branch --force --index-filter 'git rm --cached --ignore-unmatch full/path/to/file' --prune-empty --tag-name-filter cat -- --all
git push origin --force --all
git push origin --force --tags
git for-each-ref --format='delete %(refname)' refs/original | git update-ref --stdin
git reflog expire --expire=now --all
git gc --prune=now

只需用文件的完整路径取代完整/路径/到/文件,请确保您已将文件添加到.gitignore 文件中。

您还需要(暂时)允许您的存储库不快推进,因为您正在改变您的 Git 历史。

如果没有这些问题为您工作,您将希望确认您的.gitignore 文件实际上是一个.gitignore 文件,而不是文本文件, JSON 文件或类似文件。

确保它看起来像这样。