【问题标题】:How to remove a directory from git repository?如何从 git 存储库中删除目录?
【发布时间】:2011-09-12 21:02:30
【问题描述】:

我的 GitHub 存储库中有 2 个目录。我想删除其中一个。如果不删除并重新创建整个存储库,我怎么能做到这一点?

【问题讨论】:

  • 目录中有文件吗?
  • @Iarsmans:是的 6 个文件。两个目录是相同的,除了一个是大写的,另一个是小写的。
  • 您只需要:git rm -r --cached folder_name

标签: git github bitbucket delete-file git-bash


【解决方案1】:

试试rm -r -f <folder name>rm -r --force <folder name> - 强行删除文件夹

【讨论】:

    【解决方案2】:

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


    删除目录的步骤

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

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

    要从下一次提交中忽略该文件夹,请在根文件夹(初始化 git 的主项目目录)中创建一个名为 .gitignore 的文件 并将该文件夹名称放入其中。您可以忽略任意数量的文件/文件夹

    .gitignore 文件将如下所示

    /FolderName
    

    【讨论】:

    • 您还需要在另一台计算机上执行 git rm -r --cached FolderName git commit -m "Removed folder from repository" 然后拉取以保持同步。跨度>
    • 这是否会删除从添加到存储库到现在的目录?还是只是删除目录并将其重新提交到 .git 存储库?
    • 为什么不直接做一个rm -rf FolderName; git add -A; git commit -m 'removed FolderName
    • 干得好。在我的机器上,第三步不起作用。但是如果改成 $git push 就可以了
    • 对我来说倒霉:robdavisprojects@Robs-MacBook-Air default % ls default.services.yml drushrc.php settings.ddev.php default.settings.php 文件 settings.php robdavisprojects@Robs-MacBook- Air default % git rm -r --cached files fatal: pathspec 'files' 不匹配任何文件 robdavisprojects@Robs-MacBook-Air default %
    【解决方案3】:

    从 git 和本地删除目录

    您可以使用两个目录签出“master”;

    git rm -r one-of-the-directories // This deletes from filesystem
    git commit . -m "Remove duplicated directory"
    git push origin <your-git-branch> (typically 'master', but not always)
    

    从 git 但不是本地删除目录

    正如 cmets 中提到的,您通常想要做的是从 git 中删除此目录,但不要从文件系统(本地)中完全删除它

    在这种情况下使用:

    git rm -r --cached myFolder
    

    【讨论】:

    • 我也有同样的情况。当我尝试git rm -r myFolder 时,它起作用了,但也从“MyFolder”目录中删除了所有内容。必须还原“MyFolder”目录中的所有内容,然后提交。
    • @Justin 要仅从 git 中删除并保持文件系统不变,请使用 git rm -r --cached myFolder
    • 我得到的错误信息是:致命:pathspec 'directory' 不匹配任何文件。
    • @user2441441 当我试图删除一个根本没有添加到 repo 的文件夹/文件时,我弹出了这个错误
    • git rm -r --cached directory/only 从 git 跟踪中删除,但存储库结构仍然存在。
    【解决方案4】:

    两个答案的组合对我有用

    git rm -r one-of-the-directories
    git commit . -m "Remove duplicated directory"
    git push
    

    如果仍然显示一些警告,请手动删除文件

    git filter-branch --tree-filter 'rm -rf path/to/your/file' HEAD
    git push
    

    【讨论】:

      【解决方案5】:

      我之前已经提交了该文件夹,并且想在历史记录中删除该目录。

      我做了以下事情:

      将文件夹添加到.gitignore:

      echo Folder_Name/ >> .gitignore
      

      从所有提交中删除:

      git filter-branch --index-filter 'git rm -rf --cached --ignore-unmatch Folder_Name/' --prune-empty --tag-name-filter cat -- --all
      

      从旧提交中删除参考:

      git for-each-ref --format="%(refname)" refs/original/ | xargs -n 1 git update-ref -d
      

      确保完全删除所有旧的 refs

      rm -Rf .git/logs .git/refs/original
      

      执行垃圾回收

      git gc --prune=all --aggressive
      

      将您的更改推送到在线存储库:

      git push
      

      你已经完成了。

      但是您可以通过以下方式将所有更改推送到所有分支: 但是要小心这个命令!

      git push origin --all --force
      git push origin --tags --force
      

      之后该文件夹已从 git 中删除,但并未从本地磁盘中删除。

      【讨论】:

        【解决方案6】:

        如果由于某种原因,karmakaze 所说的不起作用,您可以尝试删除您想要使用的目录或使用您的文件系统浏览器(例如在 Windows 文件资源管理器中)。删除目录后,发出命令:
        git add -A
        然后
        git commit -m 'deleting directory'
        然后是
        git push origin master.

        【讨论】:

        • 这对我有用。你能解释一下 -A 参数吗?
        • @Arun -A 是 --all 的缩写,并添加所有已跟踪和未跟踪文件的更改
        • 'origin' 似乎不是 git 存储库
        【解决方案7】:

        用于删除空文件夹

        我想删除我创建的一个空目录(文件夹),git无法删除它,经过一些研究我了解到 Git 不跟踪空目录。如果您的工作树中有一个空目录,您只需使用

        将其删除
        rm -r folderName
        

        无需涉及 Git。

        【讨论】:

          【解决方案8】:

          添加新目录:

          mkdir <YOUR-DIRECTORY>
          

          但现在 Git 不知道这个新目录,因为 Git 跟踪文件而不是目录 目录

          git status
          

          Git 不会知道我们所做的更改,因此我们添加隐藏的 .keep 文件以使 Git 知道这项新更改。

          touch /YOUR-directory/.keep
          

          现在,如果您点击 git status,Git 将会知道这些更改。

          如果你想删除目录,你应该使用这个命令。

          rm -r <YOUR-DIRECTORY>
          

          如果您使用git status 进行检查,您将看到该目录已被删除。

          【讨论】:

            【解决方案9】:

            在删除任何东西之前,第一个 git 命令需要知道你是谁

            1. git 初始化
            2. git config user.name "某人"
            3. git config user.email "someone@someplace.com"
            4. git rm -r
            5. git commit -m "删除目录"
            6. git push origin master

            【讨论】:

              【解决方案10】:

              我的一位同事建议BFG Repo-Cleaner,我认为它很强大。它不仅可以删除不需要的数据,还可以从任何相关的提交信息中清除您的存储库。

              【讨论】:

                【解决方案11】:

                我通常使用git add --all 从远程存储库中删除文件/文件夹

                rm -r folder_name
                git add --all
                git commit -m "some comment"
                git push origin master
                

                master 可以替换为存储库的任何其他分支。

                【讨论】:

                  【解决方案12】:

                  转到您的 git 目录,然后键入以下命令: rm -rf 目录名>

                  删除目录后,通过以下方式提交更改: git commit -m "你的提交信息"

                  然后只需将更改推送到远程 GIT 目录: git push origin 分支名称>

                  【讨论】:

                    【解决方案13】:

                    你可以在本地删除文件夹然后推送,如下:

                    git rm -r folder_name
                    git commit -m "your commit"
                    git push origin master
                    

                    【讨论】:

                      【解决方案14】:

                      您可以使用 Attlasian 源代码树 (Windows) (https://www.atlassian.com/software/sourcetree/overview)。 只需从树中选择文件并按下顶部的“删除”按钮。文件将从本地存储库和本地 git 数据库中删除。然后提交,然后推送。

                      【讨论】:

                        【解决方案15】:

                        你可以试试这个: git rm -rf &lt;directory_name&gt;

                        它会强制删除目录。

                        【讨论】:

                        • 这也会从本地目录中删除
                        【解决方案16】:

                        如果您删除目录中的文件(git rm 作为其他答案的解释),那么就 git 而言,该目录不再存在。您不能提交一个空目录,也不能删除一个。

                        这与颠覆不同,您必须明确地svn rm emptyfolder/,顺便说一下,为什么 git 的 man 页面将自己描述为“愚蠢的内容跟踪器”

                        "How do I add an empty directory to a git repository" 上的答案链接到FAQ on this subject

                        目前git索引的设计 (暂存区)只允许文件 被列出来,没有人足够称职 进行更改以允许为空 目录已经足够关心 这种情况要补救。

                        自动添加目录 在其中添加文件时。那 是,永远不必添加目录 到存储库,并且不被跟踪 靠自己。

                        你可以说“git add &lt;dir&gt;” 将在那里添加文件。

                        如果你真的需要一个目录 存在于结帐中,您应该创建一个 文件在里面。 .gitignore 适用于 这个目的;你可以把它留空, 或填写您的文件名 期望出现在目录中。

                        【讨论】:

                          猜你喜欢
                          • 2012-03-02
                          • 2011-05-29
                          • 2015-10-21
                          • 2021-05-13
                          • 2011-01-04
                          相关资源
                          最近更新 更多