我的存储库中有一个现有的Visual Studio项目。我最近在我的项目下添加了一个.gitignore文件,我假设它告诉Git忽略文件中列出的文件。

我的问题是,所有这些文件都已经被跟踪,据我所知,Git不会忽略一个已经被跟踪的文件,直到一个规则被添加到这个文件中来忽略它。

建议使用:git rm—cached并手动取消跟踪它们,但这将花费我很长时间来逐个查看它们。

我考虑过删除存储库并重新创建它,但这次使用.gitignore文件,但一定有更好的方法来做到这一点。


当前回答

下面是一种“取消跟踪”任何文件的方法,否则在当前的排除模式集下将被忽略:

(GIT_INDEX_FILE=some-non-existent-file \
git ls-files --exclude-standard --others --directory --ignored -z) |
xargs -0 git rm --cached -r --ignore-unmatch --

这将文件保留在工作目录中,但将它们从索引中删除。

这里使用的技巧是为git ls-files提供一个不存在的索引文件,以便它认为没有跟踪文件。上面的shell代码请求如果索引为空将被忽略的所有文件,然后使用git rm将它们从实际索引中删除。

在文件被“untracked”之后,使用git status来验证没有什么重要的东西被删除(如果是这样的话,调整你的排除模式并使用git reset——path来恢复被删除的索引项)。然后做一个新的提交,去掉“脏东西”。

“脏东西”仍然存在于任何旧提交中。如果你真的需要一个干净的历史记录,你可以使用git filter-branch来生成旧提交的干净版本(注意,使用git filter-branch会“重写历史”,所以如果你有任何合作者在“crud”第一次引入之后拉掉了你的任何历史提交,那就不应该掉以轻心)。

其他回答

下面是一种“取消跟踪”任何文件的方法,否则在当前的排除模式集下将被忽略:

(GIT_INDEX_FILE=some-non-existent-file \
git ls-files --exclude-standard --others --directory --ignored -z) |
xargs -0 git rm --cached -r --ignore-unmatch --

这将文件保留在工作目录中,但将它们从索引中删除。

这里使用的技巧是为git ls-files提供一个不存在的索引文件,以便它认为没有跟踪文件。上面的shell代码请求如果索引为空将被忽略的所有文件,然后使用git rm将它们从实际索引中删除。

在文件被“untracked”之后,使用git status来验证没有什么重要的东西被删除(如果是这样的话,调整你的排除模式并使用git reset——path来恢复被删除的索引项)。然后做一个新的提交,去掉“脏东西”。

“脏东西”仍然存在于任何旧提交中。如果你真的需要一个干净的历史记录,你可以使用git filter-branch来生成旧提交的干净版本(注意,使用git filter-branch会“重写历史”,所以如果你有任何合作者在“crud”第一次引入之后拉掉了你的任何历史提交,那就不应该掉以轻心)。

使用git clean 找人帮忙跑步吧

git clean -h

如果你想先看看会发生什么,请确保传递-n开关进行演练:

git clean -xn

清除被忽视的垃圾

git clean -xdf

注意:您可能会忽略本地配置文件,如数据库。Yml也会被删除。使用风险自负。

Then

git add .
git commit -m ".gitignore is now working"
git push

我认为这是向现有存储库添加.gitignore文件的一种简单方法。

先决条件:

你需要一个浏览器来访问你的github帐户。

步骤

在您需要的(现有的)项目中创建一个新文件,并将其命名为.gitignore。一旦你将文件命名为.gitignore,你就会得到关于.gitignore模板的提示性提示。要么使用这些模板,要么使用gitignore。IO来生成gitignore文件的内容。 提交更改。 现在克隆这个存储库。

玩得开心!

这个回答解决了我的问题:

首先,提交所有挂起的更改。

然后执行如下命令:

git rm -r --cached .

这将从索引中删除所有内容,然后运行:

git add .

提交:

git commit -m ".gitignore is now working"

请注意,当您将此文件推到存储库并从其他地方拉入这些文件仍然被跟踪的状态时,这些文件将被删除

如果你添加.gitignore太晚,git将继续跟踪已经提交的文件。要解决这个问题,您总是可以删除不需要的文件的所有缓存实例。

首先,要检查你实际上在跟踪哪些文件,你可以运行:

git ls-tree——name-only——full-tree -r HEAD

假设你在像cache/这样的目录中发现了不需要的文件,那么针对该目录而不是所有文件会更安全。

所以不要:

Git rm -r——cached。

锁定不需要的文件或目录会更安全:

Git rm -r——cached cache/

然后继续添加所有更改,

转到添加 。

和提交…

Git commit -m”。Gitignore现在正在工作"

参考:https://amyetheredge.com/code/13.html