将目录添加到. gitignore后从远程存储库中删除目录

我提交并将一些目录推送到github。之后,我更改了.gitignore文件,添加了一个应该忽略的目录。一切正常,但(现在被忽略的)目录保留在github上。

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

325513 次浏览

.gitignore文件中的规则仅适用于未跟踪的文件。由于该目录下的文件已经提交到您的存储库中,因此您必须取消它们,创建提交,并将其推送到GitHub:

git rm -r --cached some-directorygit commit -m 'Remove the now ignored directory "some-directory"'git push origin master

如果不重写存储库的历史记录,您就无法从历史记录中删除该文件-如果其他人正在使用您的存储库,或者您正在多台计算机上使用它,您不应该这样做。如果您仍然想这样做,您可以使用git filter-branch重写历史记录-这里有一个有用的指南

此外,请注意git rm -r --cached some-directory的输出将类似于:

rm 'some-directory/product/cache/1/small_image/130x130/small_image.jpg'rm 'some-directory/product/cache/1/small_image/135x/small_image.jpg'rm 'some-directory/.htaccess'rm 'some-directory/logo.jpg'

rm是来自git的关于存储库的反馈;文件仍在工作目录中。

我这样做:

git rm --cached `git ls-files -i --exclude-from=.gitignore`git commit -m 'Removed all files that are in the .gitignore'git push origin main

这将删除您的git忽略中的所有文件/文件夹,节省您必须手动选择每个文件/文件夹


这似乎已经停止为我工作,我现在做:

 git rm -r --cached .git add .git commit -m 'Removed all files that are in the .gitignore'git push origin main

Blundell的回答应该有效,但由于某种奇怪的原因,它与我无关。我必须先将第一个命令输出的文件名通过管道传输到一个文件中,然后循环遍历该文件并逐个删除该文件。

git ls-files -i --exclude-from=.gitignore > to_remove.txtwhile read line; do `git rm -r --cached "$line"`; done < to_remove.txtrm to_remove.txtgit commit -m 'Removed all files that are in the .gitignore'git push origin master

根据我的回答:如何从git存储库中删除目录?

仅从git存储库中删除文件夹/目录,而不是从本地try 3个简单步骤。


删除目录的步骤

git rm -r --cached FolderNamegit commit -m "Removed folder from repository"git push origin master

在下一次提交中忽略该文件夹的步骤

要从下一次提交中忽略该文件夹,请在root中创建一个名为. gitignore的文件并将该文件夹名称放入其中。您可以放入任意数量的文件夹

. gitignore文件看起来像这样

/FolderName

删除目录

如果您正在使用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

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

使用Github桌面GUI非常简单。

  1. 暂时将文件夹移动到另一个位置(从项目文件夹中移出)。

  2. 编辑您的.gitignore文件并删除github页面上删除主存储库的文件夹条目。

  3. 提交并同步项目文件夹。

  4. 将文件夹重新移动到项目文件夹中

  5. 重新编辑.gitignore文件。

仅此而已。

布伦德尔的第一个回答对我不起作用。但它向我展示了正确的方法。我做了同样的事情:

> 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文件夹,这不是我的预期操作。

此方法应用标准. gitignore行为和不需要手动指定需要忽略的文件

不能再使用--exclude-from=.gitignore了:/-这是更新的方法:

一般建议:从一个干净的回购开始-所有提交的内容,工作目录或索引中没有任何未决内容,再做个备份

#commit up-to-date .gitignore (if not already existing)#this command must be run on each branchgit add .gitignoregit commit -m "Create .gitignore"
#apply standard git ignore behavior only to current index, not working directory (--cached)#if this command returns nothing, ensure /.git/info/exclude AND/OR .gitignore exist#this command must be run on each branchgit ls-files -z --ignored --exclude-standard | xargs -0 git rm --cached
#optionally add anything to the index that was previously ignored but now shouldn't be:git add *
#commit again#optionally use the --amend flag to merge this commit with the previous one instead of creating 2 commits.
git commit -m "re-applied modified .gitignore"
#other devs who pull after this commit is pushed will see the  newly-.gitignored files DELETED

如果您还需要从分支的提交历史记录或者如果您不希望从将来的拉取中删除新忽略的文件中清除新忽略的文件,请参阅这个答案

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

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

这将从索引中删除所有文件,将git配置为不更改行结尾,重新调整行结尾并暂存您刚刚删除的所有文件除了.gitignore中指定的文件

然后git commit

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

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

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