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


当前回答

这就是我如何解决我的问题:

git filter-branch --tree-filter 'rm -rf path/to/your/file' HEAD git push

在此,我们基本上正在试图在以前的任务中重写该特定文件的历史。

有关更多信息,您可以在此处参阅过滤器分支的男性页面。

来源:从存储库中删除敏感数据 - 使用过滤器分支

来源:Git:如何删除错误的大文件

其他回答

使用 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 文件,使用命令如 echo node_modules >>.gitignore,它不会工作。

窗口终端存储文件在 UCS-2 LE BOM 和 git 似乎不接受它。

您可以通过在笔记本中打开并使用 UTF-8 编码重新存储。

此分類上一篇

它现在工作。

我认为他们需要纠正这一点,因为做echo“filetoignore” >>.gitignore实际上看起来非常有用

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

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

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

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

移动或复制文件到一个安全的位置,所以你不会失去它。

文件仍然会出现,如果你转到以前的任务之一,或另一个分支,它没有被删除. 但是,在所有未来的任务,你不会再看到文件. 如果文件在 Git 忽略,那么你可以将其返回文件夹, Git 不会看到它。

在我的情况下,我需要在.gitignore 文件中插入 ".envrc" 。

然后我用了:

git update-index --skip-worktree .envrc
git rm --cached .envrc

文件已被删除。

然后我再次承诺,说文件已被删除。

但当我使用 git log -p 命令时,文件的内容(这是 Amazon S3 的秘密认证)显示已删除的内容,我不想在 Git 存储库的历史上显示此内容。

然后我用了这个命令:

git filter-branch --index-filter 'git rm --cached --ignore-unmatch .envrc' HEAD

我再也不会看到内容了。