首页 文章

如何从git repo中删除文件?

提问于
浏览
1464

我已经将一个名为 "file1.txt" 的文件添加到git repo中 . 之后我提交了它,添加了几个名为 dir1dir2 的目录,并将它们提交给git repo .

现在当前的回购有 "file1.txt"dir1dir2 .
如何删除 "file1.txt" 而不影响 dir1dir2 等其他人?

18 回答

  • 46

    如果要从repo中删除文件,但将其保留在文件系统中(将不会跟踪):

    bykov@gitserver:~/temp> git rm --cached file1.txt
    bykov@gitserver:~/temp> git commit -m "remove file1.txt from the repo"
    

    如果要从repo和文件系统中删除文件,则有两个选项:

    • 如果文件没有在索引中暂存更改:
    bykov@gitserver:~/temp> git rm file1.txt
    bykov@gitserver:~/temp> git commit -m "remove file1.txt"
    
    • 如果文件在索引中进行了更改:
    bykov@gitserver:~/temp> git rm -f file1.txt
    bykov@gitserver:~/temp> git commit -m "remove file1.txt"
    
  • 559

    使用git rm

    git rm file1.txt
    git commit -m "remove file1.txt"
    

    但是,如果您只想从Git存储库中删除文件而不是从文件系统中删除它,请使用:

    git rm --cached file1.txt
    git commit -m "remove file1.txt"
    

    并将更改推送到远程仓库

    git push origin branch_name
    
  • 62

    git rm file.txt 从repo中删除文件但 also deletes it from the local file system .

    要从repo中删除文件并 not 从本地文件系统中删除它,请使用:
    git rm --cached file.txt

    下面的确切情况是我使用git维护我公司网站的版本控制,但"mickey"目录是一个tmp文件夹,用于与CAD开发人员共享私人内容 . 当他需要巨大的文件时,我创建了一个私有的,未链接的目录和ftpd文件,供他通过浏览器获取 . 忘记我做了这个,后来我从网站的基本目录中执行了 git add -A . 随后, git status 显示了需要提交的新文件 . 现在我需要从git的跟踪和版本控制中删除它们......

    下面的示例输出来自我刚刚发生的事情,我无意中删除了 .003 文件 . 值得庆幸的是,我并不关心 .003 本地副本发生了什么,但是其他一些当前更改的文件是我刚刚对网站所做的更新,并且会在本地文件系统上删除史诗! "Local file system" =直播网站(不是很棒的做法,但却是现实) .

    [~/www]$ git rm shop/mickey/mtt_flange_SCN.7z.003
    error: 'shop/mickey/mtt_flange_SCN.7z.003' has local modifications
    (use --cached to keep the file, or -f to force removal)
    [~/www]$ git rm -f shop/mickey/mtt_flange_SCN.7z.003
    rm 'shop/mickey/mtt_flange_SCN.7z.003'
    [~/www]$ 
    [~/www]$ git status
    # On branch master
    # Changes to be committed:
    #   (use "git reset HEAD <file>..." to unstage)
    #
    #   deleted:    shop/mickey/mtt_flange_SCN.7z.003
    #
    # Changed but not updated:
    #   (use "git add <file>..." to update what will be committed)
    #   (use "git checkout -- <file>..." to discard changes in working directory)
    #
    #   modified:   shop/mickey/mtt_flange_SCN.7z.001
    #   modified:   shop/mickey/mtt_flange_SCN.7z.002
    [~/www]$ ls shop/mickey/mtt_flange_S*
    shop/mickey/mtt_flange_SCN.7z.001  shop/mickey/mtt_flange_SCN.7z.002
    [~/www]$ 
    [~/www]$ 
    [~/www]$ git rm --cached shop/mickey/mtt_flange_SCN.7z.002
    rm 'shop/mickey/mtt_flange_SCN.7z.002'
    [~/www]$ ls shop/mickey/mtt_flange_S*
    shop/mickey/mtt_flange_SCN.7z.001  shop/mickey/mtt_flange_SCN.7z.002
    [~/www]$ 
    [~/www]$ 
    [~/www]$ git status
    # On branch master
    # Changes to be committed:
    #   (use "git reset HEAD <file>..." to unstage)
    #
    #   deleted:    shop/mickey/mtt_flange_SCN.7z.002
    #   deleted:    shop/mickey/mtt_flange_SCN.7z.003
    #
    # Changed but not updated:
    #   modified:   shop/mickey/mtt_flange_SCN.7z.001
    [~/www]$
    

    Update: 这个答案正在增加一些流量,所以我想我会提到我的other Git answer分享了几个很棒的资源:This page有一个图形可以帮助我揭开Git的神秘面纱 . "Pro Git" book is online并帮了我很多忙 .

  • 14

    如果您的文件已经在GitHub上,you now (July 2013) can直接从Web GUI删除它!

    只需查看存储库中的任何文件,单击顶部的垃圾桶图标,然后像任何其他基于Web的编辑一样提交删除 .

    delete button

    (提交将反映删除该文件):

    commit a deletion

    就这样,它已经消失了 . 有关这些功能的帮助,请务必阅读有关创建,移动,重命名和删除文件的帮助文章 . 注意:由于它是一个版本控制系统,如果您以后需要恢复该文件,Git总会退缩 .

    最后一句意味着删除的文件仍然是历史记录的一部分,您可以轻松地恢复它(但尚未通过GitHub Web界面):

    见“Restore a deleted file in a Git repo” .

  • 23

    这是唯一对我有用的选项 .

    git filter-branch -f --index-filter 'git rm --cached --ignore-unmatch *.sql'
    

    注意:将* .sql替换为您的文件名或文件类型 . 要非常小心,因为这会经历每次提交并将此文件类型翻录出来 .

  • 7

    此外,如果它是要删除的文件夹及其后续子文件夹或文件,请使用:

    git rm -r foldername
    
  • 0

    更一般地说, git help 将至少帮助解决这样的简单问题:

    zhasper@berens:/media/Kindle/documents$ git help
    usage: git [--version] [--exec-path[=GIT_EXEC_PATH]] [--html-path] [-p|--paginate|--no-pager] [--bare] [--git-dir=GIT_DIR] [--work-tree=GIT_WORK_TREE] [--help] COMMAND [ARGS]
    
    The most commonly used git commands are:
       add        Add file contents to the index
       :
       rm         Remove files from the working tree and from the index
    
  • 9

    git rm 将仅从现在开始删除此分支上的文件,但它仍保留在历史记录中,git将记住它 .

    正确的做法是 git filter-branch ,正如其他人在这里提到的那样 . 它将重写分支历史记录中的每个提交以删除该文件 .

    但是,即使这样做,git也能记住它,因为在reflog,remotes,tags等中可以引用它 .

    如果你想一步完全消除它,我建议你使用 git forget-blob

    https://ownyourbits.com/2017/01/18/completely-remove-a-file-from-a-git-repository-with-git-forget-blob/

    这很容易,只需做 git forget-blob file1.txt .

    这将删除每个引用,执行 git filter-branch ,最后运行git垃圾收集器 git gc 以完全删除repo中的此文件 .

  • 5

    另一种方法是,如果要使用rm命令从本地文件夹中删除该文件,然后将更改推送到远程服务器 .

    rm file1.txt
    
    git commit -a -m "Deleting files"
    
    git push origin master
    
  • 3

    删除特定文件

    git rm文件名

    以单次递归方式从目录中清除所有未跟踪文件

    git clean -fdx

  • 2449

    如果你有GitHub for Windows应用程序,你可以通过5个简单的步骤删除文件:

    • 单击“同步” .

    • 单击文件所在的目录,然后选择最新版本的文件 .

    • 点击工具并选择"Open a shell here."

    • 在shell中,键入:"rm "并按Enter键 .

    • 提交更改并重新同步 .

  • 2

    在我的情况下,我尝试在几次提交后删除github上的文件,但保存在计算机上

    git filter-branch -f --index-filter 'git rm --cached --ignore-unmatch file_name_with_path' HEAD
    git push --force -u origin master
    

    后来这个文件被忽略了

  • 5
    • 首先,从本地存储库中删除文件 .

    git rm -r文件名

    或者,仅从本地存储库但从文件系统中删除文件

    git rm --cached文件名

    • 其次,将更改提交到本地存储库 .
    git commit -m "unwanted files or some inline comments"
    
    • 最后,将本地更改更新/推送到远程存储库 .
    git push
    
  • -6

    我尝试了很多建议的选项,似乎都没有工作(我不会列出各种问题) . 我最终做了什么,哪个有效,简单直观(对我来说)是:

    • 将整个本地回购搬到其他地方

    • 再次从主服务器到本地驱动器克隆存储库

    • 将文件/文件夹从#1中的原始副本复制回#2中的新克隆

    • 确保.gitignore文件中不存在或排除问题大文件

    • 做通常的git add / git commit / git push

  • 12

    注意:如果您只想从git中删除文件,请使用以下内容:

    git rm --cached file1.txt
    

    如果要从硬盘中删除:

    git rm file1.txt
    

    如果要删除文件夹(该文件夹可能包含少量文件),则应使用递归命令删除,如下所示:

    git rm -r foldername
    

    如果要删除其他文件夹中的文件夹

    git rm -r parentFolder/childFolder
    

    然后,你可以照常 commitpush . 但是,如果要恢复已删除的文件夹,可以按照以下步骤操作:recover deleted files from git is possible.

    来自doc:git rm [-f | --force] [-n] [-r] [--cached] [--ignore-unmatch] [--quiet] [ - ] <file> ...
    选项<file> ...要删除的文件 . 可以给出Fileglobs(例如* .c)来删除所有匹配的文件 . 如果你想让Git扩展文件glob字符,你
    可能需要shell逃脱它们 . 可以给出一个前导目录名(例如,删除dir / file1和dir / file2的目录)以删除目录中的所有文件,并递归所有子目录,但这需要显式给出-r选项 . -f --force覆盖最新检查 .
    -n --dry-run实际上不删除任何文件 . 相反,只显示它们是否存在于索引中,否则将被命令删除 .
    -r在给出前导目录名时允许递归删除 .

    • 此选项可用于将命令行选项与文件列表分开(当文件名可能被误认为时非常有用)
      命令行选项) . --cached使用此选项仅从索引中取消暂存和删除路径 . 无论是否修改了工作树文件,都将保持不变 .
      --ignore-unmatch即使没有文件匹配,也退出状态为零 .
      -q --quiet git rm通常为每个删除的文件输出一行(以rm命令的形式) . 此选项会抑制输出 .

    Read more on official doc.

  • 2

    我有obj和bin文件意外地进入了我不想污染我的'更改文件'列表的仓库

    在我注意到他们去了遥控器后,我通过将其添加到 .gitignore 来忽略它们

    /*/obj
    /*/bin
    

    问题是它们已经在远程中,当它们被更改时,它们会弹出更改并污染已更改的文件列表 .

    要停止查看它们,您需要从远程存储库中删除整个文件夹 .

    在命令提示符中:

    • CD到repo文件夹(即 C:\repos\MyRepo

    • 我想删除SSIS \ obj . 看来你只能在顶层删除,所以你现在需要把CD转成SSIS :(即 C:\repos\MyRepo\SSIS

    • 现在输入魔法咒语 git rm -r -f obj

    • rm =删除

    • -r =递归删除

    • -f =意味着力量,因为你真的是指它

    • obj是文件夹

    • 现在运行 git commit -m "remove obj folder"

    我收到一条惊人的消息,说13个文件改变了315222删除

    然后因为我不想查看CMD行,我进入Visual Sstudio并进行同步将其应用到远程

  • 0

    使用 git rm 从repo中删除文件后,您可以使用BFG Repo-Cleaner完全轻松地从repo历史记录中删除该文件 .

  • 29

    如果你没有在你的本地仓库中存档但是在git repo中,那么只需通过web界面在git repo中打开文件,然后在界面的右上角找到删除按钮 . Click Here, To view interface Delete Option

相关问题