我提交并将一些目录推送到github。之后,我修改了.gitignore文件,添加了一个应该忽略的目录。一切都很好,但(现在被忽略的)目录仍在github上。
如何从github和存储库历史记录中删除该目录?
我提交并将一些目录推送到github。之后,我修改了.gitignore文件,添加了一个应该忽略的目录。一切都很好,但(现在被忽略的)目录仍在github上。
如何从github和存储库历史记录中删除该目录?
当前回答
第一种解决方案:
git rm --cached `git ls-files -i -c --exclude-from=.gitignore`
git commit -m 'Removed all files that are in the .gitignore'
git push origin main
这将删除git中的所有文件/文件夹,从而避免您必须手动选择每个文件/文件夹
第二种解决方案:它从本地git存储库中删除文件。git rm-r--缓存。git添加。gitcommit-m'删除了.gitignore中的所有文件'git推送原点主
--cached标志从git存储库中删除文件,但不从文件系统中删除。
其他回答
此方法应用标准的.gitignore行为,不需要手动指定需要忽略的文件。无法再使用--exclude-from=.gitignore:/-以下是更新的方法:一般建议:从一个干净的repo开始-所有内容都已提交,工作目录或索引中没有挂起的内容,并进行备份!
#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
如果您还需要从分支的提交历史记录中清除新忽略的文件,或者如果您不希望从将来的拉取中删除新忽略的文档,请参阅此答案。
如果您使用的是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
如果您在windows机器上使用Blundell所描述的技术(删除所有内容,然后添加所有内容),则可能会遇到所有文件都被修改的问题,因为行结尾发生了变化。要避免这种情况,请使用以下命令:
git rm -r --cached .
git config --global core.autocrlf false
git add --renormalize .
git add .
这将从索引中删除所有文件,将git配置为不更改行尾,重新规范行尾,并暂存除.gitignore中指定的文件之外的所有刚刚删除的文件
然后git提交
参考:如何在不更改空格的情况下从.gitignore中列出的存储库中删除文件
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
注意:此解决方案仅适用于Github桌面GUI。
使用Github桌面GUI非常简单。
暂时将文件夹移动到其他位置(从项目文件夹中移出)。编辑.gitignore文件并删除文件夹条目,该条目将在github页面上删除主存储库。提交并同步项目文件夹。将文件夹重新移动到项目文件夹中重新编辑.gitignore文件。
这就是全部。