首页 文章

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

提问于
浏览
470

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

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

7 回答

  • 37

    .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关于存储库的反馈;文件仍在工作目录中 .

  • 0

    我这样做:

    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
    
  • 214

    根据我的答案:How to remove a directory from git repository?

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


    Steps to remove directory

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

    Steps to ignore that folder in next commits

    要在下次提交时忽略该文件夹,请在根目录中创建一个名为.gitignore的文件,并将该文件夹名称放入其中 . 您可以根据需要添加任意数量

    .gitignore 文件将如下所示

    /FolderName
    

    remove directory

  • 5

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

  • 2

    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

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

    通过使用Github Desktop GUI它非常简单 .

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

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

    • 提交并同步项目文件夹 .

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

    • 重新编辑 .gitignore 文件 .

    就这样 .

  • 842

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

相关问题