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

时间:2011-10-28 09:08:09

标签: git github gitignore

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

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

8 个答案:

答案 0 :(得分:912)

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

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

如果不重写存储库的历史记录,则无法从历史记录中删除该文件 - 如果其他人正在使用您的存储库,或者您正在从多台计算机上使用它,则不应该执行此操作。如果您仍想这样做,可以使用git filter-branch重写历史记录 - there is a helpful guide to that here

另外,请注意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的关于存储库的反馈;文件仍在工作目录中。

答案 1 :(得分:223)

我这样做:

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

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


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

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

答案 2 :(得分:6)

Blundell的第一个回答并不适合我。然而它向我展示了正确的方法。我做了同样的事情:

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

答案 3 :(得分:4)

Blundell的回答应该有效,但出于某些奇怪的原因,它与我无关。我不得不首先将第一个命令输出的文件名输入到一个文件中,然后遍历该文件并逐个删除该文件。

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

答案 4 :(得分:2)

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

使用Github Desktop GUI非常简单。

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

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

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

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

  5. 重新编辑.gitignore文件。

  6. 这就是全部。

答案 5 :(得分:2)

  

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

     

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

     

一般建议:从干净的仓库开始-提交的所有内容,工作目录或索引中没有待处理的内容,并进行备份

#commit up-to-date .gitignore (if not already existing)
#this command must be run on each branch
git add .gitignore
git 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 branch
git 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

如果您还需要从分支的提交历史记录中清除新忽略的文件,,或者,如果您不想从以后的提取操作中删除新忽略的文件,请参见{{3} }。

答案 6 :(得分:0)

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

答案 7 :(得分:0)

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

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

这会从索引中删除所有文件,将 git 配置为不更改行尾,重新规范行尾并暂存您刚刚删除的所有文件除了在 { {1}}

那么 .gitignore

参考:How to remove files from repository listed in .gitignore without changing whitespace