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


当前回答

把它移动出来,承诺,然后把它移动回来。

这对我来说在过去已经工作了,但可能有更“迷人的”方式来实现这一点。

其他回答

为文件 / 文件夹执行下列步骤:

删除文件:

需要添加该文件到.gitignore. 需要删除该文件使用命令(git rm --cached 文件名)。 需要运行(git add.). 需要(commit -m)“文件删除”。 最后,(git push)。

例如:

我想删除 test.txt 文件. 我偶然推到 GitHub 并想删除它. 命令将如下:

首先,在.gitignore 文件中添加“test.txt”

git rm --cached test.txt
git add .
git commit -m "test.txt removed"
git push

删除文件夹:

需要添加该文件夹到.gitignore 文件夹. 需要删除该文件夹使用命令(git rm -r --cached 文件夹名称)。 需要运行(git add.). 需要(commit -m)“文件夹删除”。 最后,(git push)。

例如:

我想删除.idea 文件夹/目录. 我偶然推到 GitHub 并想删除它。

首先,在.gitignore 文件中添加.idea

git rm -r --cached .idea
git add .
git commit -m ".idea removed"
git push

使用 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 历史。

我知道这个答案已经迟到了很多年,但是我决定我想在注意到可能有不同的答案后做出贡献,取决于用户想要的结果。

如何强迫Git完全忘记这一点?

这取决于下列哪个是所需的结果:

停止跟踪文件并将其从存储库中删除,或停止跟踪文件,而不会从存储库中删除(可能其他合作伙伴可以下载)

因为(一),解决方案就像上面的马特的答案一样;因为(二),请参见康斯坦丁的答案。

来源: https://stackabuse.com/git-stop-tracking-file-after-adding-to-gitignore/

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

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

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

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

git ls-files -c --ignored --exclude-standard -z | xargs -0 git rm --cached
git commit -am "Remove ignored files"

这取消了被忽略的文件列表,从指数中删除它们,并执行了变更。