9 题: 从Git存储库中删除文件而不从本地文件系统中删除它

在...创建的问题 Fri, Jul 3, 2015 12:00 AM

我的初始提交包含一些日志文件。我已将*log添加到.gitignore,现在我想从我的存储库中删除日志文件。

 
git rm mylogfile.log

将从存储库中删除文件,但也会将其从本地文件系统中删除。

如何在没有删除文件的本地副本的情况下从repo 中删除此文件?

    
2761
  1. 2014-05-24 23:21:52Z
  2. 值得注意的是,最受欢迎的答案对某些人来说是危险的。如果你使用的是远程仓库而不是推送本地,那么将你从git中删除的那些文件拉到别处将被删除。其中一个回复中提到了这一点,但未对其进行评论。
    2018-08-24 04:17:11Z
  3. 醇>
    9答案                              9 跨度>                         

    来自man文件:

      

    当给出--cached时,分阶段内容必须匹配分支的尖端或磁盘上的文件,允许从索引中删除文件。

    因此,对于单个文件:

     
    git rm --cached mylogfile.log
    

    和单个目录:

     
    git rm --cached -r mydirectory
    
        
    3962
    2019-03-23 00:43:50Z
    1. 很容易错过,因为它不像svn rm --keep-local那样自我解释。
      2011-06-24 11:44:31Z
    2. 但是如何保留远程服务器上的文件?这保留了我的本地服务器,但是如果我从另一台服务器推送和拉取,该文件将被删除。我还为该文件添加了一个.gitignore,但它仍然被删除了
      2013-02-22 15:44:02Z
    3. 如果您在git pull
      之后提交,这仍然会删除git rm上的文件
      2014-05-22 17:02:12Z
    4. 值得注意的是,在答案中运行命令后,您需要使用git commit -m "Commit message"git push。如果您有任何其他阶段性更改(请参阅git status),它们也将在此时提交。
      2017-09-11 20:29:32Z
    5. 由于这是最常被接受的答案而不做,所要求的是什么,我会告诉我做什么。我使用命令git rm --cached mylogfile.log并从存储库中删除该文件。为了避免丢失生产系统上的文件,我会对文件进行备份并在此之后进行拉取。如前所述,文件被删除,需要从备份中复制回来。这是一个非常痛苦的事情,但我找不到解决这个问题的更好方法。
      2017-12-14 18:37:06Z
    6. 醇>

    要从repo中删除整个文件夹(如Resharper文件),请执行以下操作:

     
    git rm -r --cached folderName
    

    我已经提交了一些resharper文件,并且不希望这些文件持续存在于其他项目用户。

        
    262
    2012-10-02 09:25:13Z
    1. 仅为未来访问者添加注释:不要使用GUI将提交“同步”回到回购。这会将文件拉回到你的身上当地的回购您必须执行Git Push repo branch才能从远程执行文件中删除文件。
      2014-12-04 04:24:11Z
    2. 醇>

    您还可以根据.gitignore从存储库中删除文件,而不从本地文件系统中删除它们:

     
    git rm --cached `git ls-files -i -X .gitignore`
    

    或者,在Windows Powershell上:

     
    git rm --cached $(git ls-files -i -X .gitignore)
    
        
    185
    2017-12-06 17:42:47Z
    1. 在Windows上不起作用。 git ls-files -i -X .gitignore有效,但我不知道如何将文件发送到'git rm'。你知道怎么做吗?
      2014-05-09 06:04:06Z
    2. 如果您使用Git Bash而不是cmd-console
      ,则可在Windows上运行
      2014-12-16 18:12:34Z
    3. 喜欢这个。工作,除了我有一些文件最终在文件名中有空格。我在这里修改了解决方案:git ls-files -i -X .gitignore | xargs -I{} git rm --cached "{}"。请考虑在此处修改或添加此解决方案,因为它是一个很棒的工具...
      2016-03-12 17:48:55Z
    4. 我没有尝试,但应该测试它是否会删除像.gitkeep这样的文件保存在存储库中的空文件夹。例如。 .gitignore包含文件夹uploads,并且强制repo跟踪.gitkeep。通过在uploads下删除所有回购,它也将删除.gitkeep
      2016-07-07 09:11:48Z
    5. 注意:不适用于嵌套的.gitignore文件
      2017-11-13 07:23:25Z
    6. 醇>

    根据我的回答: https://stackoverflow.com/questions/6313126/how-to-remove-a-directory -in-MY-github上的仓库

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


    删除目录的步骤

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

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

      

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

    .gitignore 文件将如下所示

     
    /FolderName
    

        
    75
    2017-09-04 04:55:24Z
    1. 完美无缺!
      2019-06-08 12:54:11Z
    2. @ gaurav很高兴它有所帮助!
      2019-06-18 08:12:09Z
    3. 醇>

    此外,如果您提交了敏感数据(例如包含密码的文件),则应将其从存储库的历史记录中完全删除。以下是解释如何执行此操作的指南: http://help.github.com/remove-sensitive-data/

        
    67
    2011-08-21 12:16:36Z
    1. 此答案应包括完成此任务所需的命令,而不是链接到其他网站。
      2018-02-02 13:08:33Z
    2. 我还会注意到我发现使用 git bfg repo清理工具更轻松,更快捷。
      2019-02-14 22:52:54Z
    3. 醇>

    更通用的解决方案:

    1. 编辑.gitignore文件。

      ECHO mylogfile.log >> .gitignore

    2. 从索引中删除所有项目。

      git rm -r -f --cached .

    3. 重建索引。

      git add .

    4. 进行新提交

      git commit -m "Removed mylogfile.log"

    59
    2013-12-13 11:42:32Z
    1. 这实际上会删除文件吗?
      2013-12-13 15:39:10Z
    2. 来自GitHub?没有。如果你已经推送到github,它将不会从网站上删除它。但它会更新你的本地git存储库。
      2013-12-14 12:37:52Z
    3. 2013-12-14 12:38:22Z
    4. 你删除的评论实际上已经被淘汰了:)解决方案rm --cashed的问题是,当一个人拉动时它最终会删除文件 - 对吗?当他们说“从存储库中删除文件而不从本地文件系统中删除”时,这不是人们想要的。现在为什么上面接受的解决方案超出了我的范围 - 可能是OP单独工作而且从未拉过?不知道。我理解github“曾经一直推到那里”的问题c
      2013-12-14 12:42:56Z
    5. 我的问题不是github - 这是当他们拉时,实际上会从同事中删除该文件。我希望删除该文件。这给我带来了巨大的问题。所以我想知道是否真的有一个解决方案确实没有删除该文件。另见评论中接受的答案: stackoverflow.com/questions/1143796 /...
      2013-12-14 13:07:46Z
    6. 醇>
      

    Git允许您通过假设它们不变来忽略这些文件。这个   通过运行git update-index --assume-unchanged path/to/file.txt命令完成。一旦这样标记文件,git就会   完全忽略该文件的任何更改;他们不会出现在什么时候   运行git status或git diff,它们也不会被提交。

    (来自 https://help.github.com/articles/ignoring-files

    因此,不要删除它,而是永远忽略对它的更改。 我认为这只适用于本地,所以除非他们运行与上面相同的命令,否则同事仍然可以看到它的变化。 (但仍需要验证这一点。)

    注意:这不是直接回答问题,而是基于其他答案的评论中的后续问题。

        
    21
    2014-01-28 11:46:49Z
    1. 嗯,我这样做但是我发现如果其他人在回购邮件上对其进行了更改,则可以覆盖该文件。
      2014-09-15 16:50:07Z
    2. 醇>

    如果您只想解开文件而不是从本地和远程仓库删除,请使用以下命令:

     
    git update-index --assume-unchanged  file_name_with_path
    
        
    9
    2018-09-07 09:05:22Z

    以上答案对我不起作用。我用filter-branch删除了所有已提交的文件。

    使用以下命令从git存储库中删除文件

     
    git filter-branch --tree-filter 'rm  file'
    

    使用以下命令从git存储库中删除文件夹:

     
    git filter-branch --tree-filter 'rm -rf directory'
    

    这将从所有提交中删除目录或文件。

    您可以使用以下命令指定提交:

     
    git filter-branch --tree-filter 'rm -rf directory' HEAD
    

    或范围:

     
    git filter-branch --tree-filter 'rm -rf vendor/gems' t49dse..HEAD
    

    要将所有内容推送到远程,您可以执行以下操作:

     
    git push origin master --force
    
        
    6
    2019-02-20 03:48:36Z
    1. 这与git rm -r --cached NAME相结合是将其从本地git repo中删除并防止它影响以后拉的人(通过从git中删除文件或目录的历史记录)的技巧。)
      2016-03-17 20:15:52Z
    2. 这会重写git历史记录,你需要推送--force after,这有点超出范围我猜的问题。在公共着名的回购中,你不能只改变那样的历史记录,因为每个已经克​​隆回购的人都会在拉动时遇到问题。
      2017-04-01 01:37:02Z
    3. 醇>
来源放置 这里