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


当前回答

对于我来说,文件在历史上仍然可用,我首先需要清除添加删除文件的命令: https://gist.github.com/patik/b8a9dc5cd356f9f6f980

下面的例子结合了最后3个命令

git reset --soft HEAD~3
git commit -m "New message for the combined commit"

推破的承诺 如果承诺已推到远程:

git push origin +name-of-branch

其他回答

例如,在使用 CVS 时,这个问题不存在, CVS 将信息存储为基于文件的变更列表。

这两篇文章对我很有帮助:

git assume-unchanged vs skip-worktree 以及如何用 Git 忽略跟踪文件的变化

git update-index --skip-worktree <file>

从此,此文件中的所有本地变更将被忽视,不会去远程。如果文件在远程中被更改,冲突将发生,当 git pull. Stash 不会工作。

git update-index --no-skip-worktree <file>
git stash
git pull

文件内容将被远程内容取代. 将您的更改从安全地点调整到文件,然后再次执行:

git update-index --skip-worktree <file>

在我的案例中,我在几个目录中有几个.lock 文件,我需要删除。

git rm -r --cached **/*.lock

这样做,在我所在的“根”下进入每个文件夹,并排除所有符合模式的文件。

下面的命令系列将从 Git 索引中删除所有项目(不是工作目录或本地存储库),然后更新 Git 索引,同时遵守 Git 忽略。

首先:

git rm -r --cached .
git add .

然后:

git commit -am "Remove ignored files"

或者作为一个单线:

git rm -r --cached . && git add . && git commit -am "Remove ignored files"

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

确保它看起来像这样。

在已承诺的DS_Store的情况下:

find . -name .DS_Store -print0 | xargs -0 git rm --ignore-unmatch

忽略它们:

echo ".DS_Store" >> ~/.gitignore_global
echo "._.DS_Store" >> ~/.gitignore_global
echo "**/.DS_Store" >> ~/.gitignore_global
echo "**/._.DS_Store" >> ~/.gitignore_global
git config --global core.excludesfile ~/.gitignore_global

最后,做一个承诺!