如何从Git存储库中删除文件?


1922

我已经添加了一个名为"file1.txt"Git仓库的文件。之后,我提交了它,添加了两个名为dir1和的目录dir2,并将它们提交到Git存储库。

现在目前的版本库"file1.txt"dir1dir2。如何删除"file1.txt"而不影响其他人,例如dir1dir2


85
git rm是正确的答案,但请记住该文件仍将保留在历史记录中。如果由于文件包含敏感信息而要删除该文件,则需要进行一些更严格的操作。(更改历史记录,尤其是对于您已经推送的内容,是一项严厉的措施,应尽可能避免。)
Keith Thompson

8
注意:在GitHub上,您现在可以直接从Web界面删除文件(甚至不必克隆存储库)。请参阅下面的答案
VonC

4
@KeithThompson如果我非常想这样做,那应该怎么做?
lessthanl0l 2014年


Answers:


3215

使用git rm

如果要从Git存储库和文件系统中删除文件,请使用:

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  

91
同样方便:git rm -r directory //删除目录和内容
2014年

10
但是,这不会在其他提交中删除该文件。
VaTo

6
@SaulOrtega:是的。要从以前的提交中删除文件(更改过去的历史记录),请参阅GitHub的帮助页面上的“ 删除敏感数据”
Greg Hewgill

14
请注意,这也会在本地删除文件。如果您只想从存储库中删除它,请执行以下操作:git rm --cached file1.txt
Weston Ganger 2015年

5
值得注意的是,如果该文件包含敏感信息(例如凭据),则应立即更改这些凭据。引用GitHub: “一旦您提交对GitHub的提交,就应该考虑其中包含的任何数据都将被泄露。如果您提交了密码,请进行更改!如果您提交了密钥,请生成一个新的密钥。”
c1moore 2016年

607

git rm file.txt从仓库中删除文件,但也从本地文件系统中删除文件

要从存储库中删除文件而不是从本地文件系统中删除文件,请使用:
git rm --cached file.txt

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

下面的示例输出来自我刚刚发生的事情,我无意中删除了该.003文件。值得庆幸的是,我不在乎本地副本到发生了什么.003,但是其他一些当前更改的文件是我刚刚对网站所做的更新,如果在本地文件系统上删除,那将是史诗般的!“本地文件系统” =实时网站(不是一个很好的实践,但是是现实)

[~/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]$

更新:这个答案正在吸引一些流量,所以我想我要提一下我其他的Git答案分享了很多宝贵的资源:此页面上有一个图形,可以帮助我揭开Git的神秘面纱。在“临Git的”一书是在网上,并帮助了我很多。


6
然后,您需要使用类似的东西来提交它,git commit -m "Just removing file1.txt"然后,如果您有一个远程存储库,则使用类似的东西来推动提交git push origin master
ban-geoengineering 2014年

77

首先,如果您正在使用git rm,特别是对于多个文件,请考虑将由外壳程序而不是git命令来解析任何通配符。

git rm -- *.anExtension
git commit -m "remove multiple files"

但是,如果您的文件已经在GitHub上,则可以(自2013年7月起)直接从Web GUI删除它!

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

然后git pull在您的本地存储库上使用“ ”,这也会在本地删除文件。
哪一个使此答案成为从git repo删除文件的(回旋)方式?
(且不说在GitHub上一个文件在“混帐回购协议”)


删除按钮

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

提交删除

就像那样,它消失了。

有关这些功能的帮助,请务必阅读有关创建移动重命名删除文件的帮助文章。

注意:由于它是一个版本控制系统,因此如果您以后需要恢复文件,Git将始终为您服务。

最后一句话表示已删除的文件仍然是历史记录的一部分,您可以轻松地还原它(但尚未通过GitHub Web界面):

请参阅“ 在Git存储库中还原已删除的文件 ”。


4
您必须滚动到底部,然后单击“提交更改”以提交删除!
LevinsonTechnologies

1
这不适用于大型文本文件。服务器尝试如屏幕快照中所示呈现文件,然后失败并显示500错误。
CapeCoder

9
这个答案是指github,问题是关于git repo。不是如何使用github界面。
Peter Marshall

65

这是对我有用的唯一选择。

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

注意:用您的文件名或文件类型替换* .sql。请非常小心,因为这将在每次提交时都经过,并将此文件类型撕掉。

编辑:注意-此命令后,您将无法推动或拉动-您将看到“无关历史记录”的拒绝,您可以使用'git push --force -u origin master'来推动或拉动


9
这是一个很好的答案,但是请注意,与其他答案相比,此命令将重写提交历史记录,并删除与模式匹配的文件的所有痕迹。如果您发现自己不小心提交了一些敏感信息(并且在需要时可以成功使用--force重写此推送到的任何远程存储库的历史记录),则此功能特别有用。
yoniLavi 2015年

3
那正是我遇到的问题,它需要经过反复试验才能正确解决。与我一起工作的一个人通过多次提交已将多个大型数据库转储提交到一个回购中。这就是为什么我在示例中使用.sql的原因。我的仓库太肿了,以至于github不再接受推送了。
杰森·格里森

3
如果您使用的是远程主服务器,则需要强制提交并使用git push --force -u origin master
AlbertMarkovski '16

2
@AlbertMarkovski对不起,我没有具体。Github实际上不接受推送,因为回购超出了其大小限制。至少几个GB。他们切断了我的联系,并通过电子邮件将其发送给我。因此,不幸的是,此时强制推送无济于事。
杰森·格里森

2
@JasonGlisson我还遇到了一个问题,即视频被意外添加到存储库中。
AlbertMarkovski

34

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

git rm -r foldername

2
这也会从本地删除文件夹!Use git rm --cached -r <foldername>

24

更一般而言,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

6
对于更复杂的事情,我感到git help困惑,但这对简单的事情是有好处的:)
James Polley 2010年

9
对于git noobs而言,实际上并不那么好,因为“ index”不是git noobs所熟悉的概念。我从成为git noob的个人经验谈起:)另外,我觉得说将rm 文件暂存为删除而不是从索引中删除更容易混淆(尽管对于noobs而言仍然没有意义)。
罗曼·斯塔科夫

同意romkyns:对我来说,“从工作树和索引中删除文件”的描述听起来不像是从存储库中删除文件的一种方式。也许如果我更好地理解git会更好。相反,这听起来像是您只是在取消暂存文件(并有选择地将它们从工作树中删除-是否一定会影响存储库?)
LarsH 2016年

14

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

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

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

  1. 如果文件在索引中暂无更改:

    bykov@gitserver:~/temp> git rm file1.txt
    bykov@gitserver:~/temp> git commit -m "remove file1.txt"
    
  2. 如果文件已在索引中暂存更改:

    bykov@gitserver:~/temp> git rm -f file1.txt
    bykov@gitserver:~/temp> git commit -m "remove file1.txt"
    

12

git rm 从现在开始只会删除该分支上的文件,但它仍保留在历史记录中,并且git会记住它。

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

但是,即使这样做了,git也可以记住它,因为在reflog,remote,tag等中可以引用它。

如果您要一步一步彻底清除它,建议您使用 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

这将删除所有引用do git filter-branch,最后运行git垃圾收集器git gc以完全删除您的存储库中的该文件。


10

如果您想使用rm命令从本地文件夹中删除文件,然后将更改推送到远程服务器,则采用另一种方法。

rm file1.txt

git commit -a -m "Deleting files"

git push origin master

10

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

git rm --cached file1.txt

如果您也要从硬盘删除:

git rm file1.txt

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

git rm -r foldername

如果要删除另一个文件夹内的文件夹

git rm -r parentFolder/childFolder

然后,您可以commitpush往常一样。但是,如果要恢复已删除的文件夹,则可以执行以下操作:可以从git恢复已删除的文件。

从文档:

git rm [-f | --force] [-n] [-r] [--cached] [--ignore-unmatch] [--quiet] [--] <file>…​

选项

<file>…​

Files to remove. Fileglobs (e.g. *.c) can be given to remove all matching files. If you want Git to expand file glob characters, you

可能需要对它们进行脱壳。可以指定一个前导目录名(例如,用于删除dir / file1的dir和dir / file2)来删除目录中的所有文件,以及递归地删除所有子目录,但这需要显式地指定-r选项。 -f --force

Override the up-to-date check.

-n --dry-run

Don’t actually remove any file(s). Instead, just show if they exist in the index and would otherwise be removed by the command.

-r

Allow recursive removal when a leading directory name is given.

--

This option can be used to separate command-line options from the list of files, (useful when filenames might be mistaken for

命令行选项)。 --cached

Use this option to unstage and remove paths only from the index. Working tree files, whether modified or not, will be left alone.

--ignore-unmatch

Exit with a zero status even if no files matched.

-q --quiet

git rm normally outputs one line (in the form of an rm command) for each file removed. This option suppresses that output.

了解更多有关官方文档的信息。


7

删除特定文件

git rm文件名

单次递归清除目录中所有未跟踪的文件

git clean -fdx


5

如果您拥有适用于Windows的GitHub应用程序,则可以通过5个简单的步骤删除文件:

  • 单击同步。
  • 单击文件所在的目录,然后选择文件的最新版本。
  • 单击工具,然后选择“在此处打开外壳”。
  • 在外壳程序中,键入:“ rm {filename}”并按Enter。
  • 提交更改并重新同步。

5

就我而言,我尝试在几次提交后删除github上的文件,但保存在计算机上

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

后来这个文件被忽略了


3
  1. 首先,从本地存储库中删除文件。

    git rm -r文件名

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

    git rm-缓存文件名

  2. 其次,将更改提交到本地存储库。

    git commit -m "unwanted files or some inline comments"   
    
  3. 最后,将本地更改更新/推送到远程存储库中。

    git push 
    

这会删除与意外添加和推送文件相关的所有内容吗?
bapors

1

我尝试了很多建议的选项,但似乎都没有用(我不会列出各种问题)。我最终所做的,有效的(对我而言)简单而直观:

  1. 将整个本地仓库移到其他地方
  2. 再次将存储库从主服务器克隆到本地驱动器
  3. 将文件/文件夹从#1的原始副本复制回#2的新克隆
  4. 确保问题大文件不存在或不在.gitignore文件中
  5. 做通常的git add / git commit / git push


0

我有obj和bin文件,它们意外地进入了我不想污染“已更改文件”列表的存储库中

之后,我注意到他们去了遥远,我不理他们,加入这.gitignore

/*/obj
/*/bin

问题在于它们已经在远程中,并且当它们被更改时,它们会以更改的形式弹出并污染更改的文件列表。

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

在命令提示符下:

  1. CD到repo文件夹(即 C:\repos\MyRepo
  2. 我要删除SSIS \ obj。看来您只能在顶层删除,所以现在需要将CD放入SSIS :(即C:\repos\MyRepo\SSIS
  3. 现在输入魔咒 git rm -r -f obj
    • rm =删除
    • -r =递归删除
    • -f =表示力量,因为您是真的
    • obj是文件夹
  4. 现在运行 git commit -m "remove obj folder"

我收到一条警告消息,说13个文件已更改315222删除

然后,因为我不想查找CMD行,所以我进入了Visual Sstudio并进行了同步,以将其应用于远程



0

根据文档

git rm --cached giant_file

对于敏感数据,最好不要说您删除了文件,而只是将其包含在最后一次已知的提交中:

0.修改最后一次提交

git commit --amend -CHEAD

如果要从所有git历史记录中删除文件,请根据文档执行以下操作:

1.将其从您的本地历史记录中删除

git filter-branch --force --index-filter \ "git rm --cached --ignore-unmatch PATH-TO-YOUR-FILE-WITH-SENSITIVE-DATA" \  --prune-empty --tag-name-filter cat -- --all
# Replace PATH-TO-YOUR-FILE-WITH-SENSITIVE-DATA with the path to the file you want to remove, not just its filename
  1. 不要忘了将此文件包含在.gitignore中(如果您不想共享该文件(例如密码...):
echo "YOUR-FILE-WITH-SENSITIVE-DATA" >> .gitignore
git add .gitignore
git commit -m "Add YOUR-FILE-WITH-SENSITIVE-DATA to .gitignore"

3.如果您需要从遥控器上删除

git push origin --force --all

4.如果您还需要将其从标签版本中删除:

git push origin --force --tags

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.