我提交并将一些目录推送到github。之后,我修改了.gitignore文件,添加了一个应该忽略的目录。一切都很好,但(现在被忽略的)目录仍在github上。

如何从github和存储库历史记录中删除该目录?


当前回答

对于windows用户来说,这对我来说非常有用

git ls-files -i -c --exclude-from=.gitignore | %{git rm --cached $_}
git add .
git commit -m "Remove files from .gitignore"

其他回答

注意:此解决方案仅适用于Github桌面GUI。

使用Github桌面GUI非常简单。

暂时将文件夹移动到其他位置(从项目文件夹中移出)。编辑.gitignore文件并删除文件夹条目,该条目将在github页面上删除主存储库。提交并同步项目文件夹。将文件夹重新移动到项目文件夹中重新编辑.gitignore文件。

这就是全部。

如果您使用的是PowerShell,请尝试将以下命令作为单个命令。

PS MyRepo> git filter-branch --force --index-filter
>> "git rm --cached --ignore-unmatch -r .\\\path\\\to\\\directory"
>> --prune-empty --tag-name-filter cat -- --all

然后,git push-force-all。

文档:https://git-scm.com/docs/git-filter-branch

布伦德尔的第一个回答对我来说并不奏效,但它给我指明了正确的方向。我也这样做过:

> for i in `git ls-files -i --exclude-from=.gitignore`; do git rm --cached $i; done
> git commit -m 'Removed all files that are in the .gitignore'
> git push origin master

我建议您先运行以下语句检查要删除的文件:

git ls-files -i --exclude-from=.gitignore

我在visual studio中使用了一个默认的.gitignore文件,我注意到它正在删除项目中的所有日志和bin文件夹,这不是我的本意。

如果您在windows机器上使用Blundell所描述的技术(删除所有内容,然后添加所有内容),则可能会遇到所有文件都被修改的问题,因为行结尾发生了变化。要避免这种情况,请使用以下命令:

git rm -r --cached .
git config --global core.autocrlf false
git add --renormalize .
git add .

这将从索引中删除所有文件,将git配置为不更改行尾,重新规范行尾,并暂存除.gitignore中指定的文件之外的所有刚刚删除的文件

然后git提交

参考:如何在不更改空格的情况下从.gitignore中列出的存储库中删除文件

对于windows用户来说,这对我来说非常有用

git ls-files -i -c --exclude-from=.gitignore | %{git rm --cached $_}
git add .
git commit -m "Remove files from .gitignore"