我已经提交并将一些目录推送到github。之后,我更改了.gitignore
文件,添加了一个应该被忽略的目录。一切正常,但(现在被忽略的)目录保留在github上。
如何从github和存储库历史记录中删除该目录?
答案 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)
> 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非常简单。
暂时将文件夹移动到另一个位置(到项目文件夹之外)。
编辑.gitignore
文件并删除将在github页面上删除主存储库的文件夹条目。
提交并同步项目文件夹。
将文件夹重新移动到项目文件夹
重新编辑.gitignore
文件。
这就是全部。
答案 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
。
答案 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