题 如何从git repo中删除文件?


我添加了一个名为的文件 "file1.txt" 来git repo。之后我提交了它,添加了几个名为的目录 dir1 和 dir2,并将它们交给git repo。

现在的回购已经 "file1.txt"dir1 和 dir2
我该怎么删除 "file1.txt" 而不影响其他人 dir1 和 dir2


1323
2018-01-12 07:48


起源


git rm 是正确的答案,但请记住,该文件仍将存在于历史中。如果您想要删除文件,因为它有敏感信息,您需要做一些更激烈的事情。 (改变历史,特别是对于你已经推过的内容,是一个激烈的行动,如果可能应该避免。) - Keith Thompson
注意:在GitHub上,您现在可以直接从Web界面删除文件(无需克隆存储库)。看到 我的答案如下。 - VonC
@KeithThompson如果我拼命想要这样做会有什么步骤? - lessthanl0l
@ lessthanl0l: stackoverflow.com/q/872565/827263 - Keith Thompson
有关 help.github.com/articles/... - Trevor Boyd Smith


答案:


使用 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  

2228
2018-01-12 07:52



也很方便:git rm -r directory //删除目录和内容 - Reg
但是,这并不会在其他提交中删除该文件。 - VaTo
@SaulOrtega:那是对的。要从先前的提交中删除文件(更改过去的历史记录),请参阅GitHub的帮助页面 删除敏感数据。 - Greg Hewgill
请注意,这也将在本地删除该文件。如果您只想从repo中删除它:git rm --cached file1.txt - Weston Ganger
值得注意的是,如果该文件包含敏感信息(例如凭据),则应该这样做 立即更改这些凭据。去引用 GitHub上 “一旦你将提交推送到GitHub,你应该考虑它所包含的任何数据被泄露。如果你提交了密码,就改变它!如果你提交了一个密钥,那就生成一个新密码。” - c1moore


git rm file.txt 从repo中删除文件但是 还会从本地文件系统中删除它

从repo中删除文件和  从本地文件系统中删除它使用:
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神秘面纱。该 “Pro Git”一书在线 并帮助了我很多。


547
2018-05-25 20:26



然后你需要提交类似的东西 git commit -m "Just removing file1.txt" 然后,如果你有一个远程存储库,推送提交类似的东西 git push origin master。 - ban-geoengineering


如果您的文件已经在GitHub上, 你现在(2013年7月)可以 直接从Web GUI中删除它!

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

delete button

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

commit a deletion

就这样,它已经消失了。

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

注意:由于它是一个版本控制系统,如果您以后需要恢复文件,Git总会退缩。

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

见“在Git仓库中恢复已删除的文件”。


57
2017-07-04 20:53



你必须滚动到底部并点击“提交更改”以提交删除! - LevinsonTechnologies
这不适用于大型文本文件。服务器尝试在屏幕截图中呈现文件,然后失败并显示500错误。 - CapeCoder
这个答案是指github,问题是关于git repo。不是如何使用github接口。 - Peter Marshall


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

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

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


39
2018-02-27 19:29



这是一个很好的答案,但请注意,与其他答案相比,此命令会重写提交历史记录并删除与该模式匹配的所有文件的跟踪。如果您发现意外提交了一些敏感信息(如果需要,可以成功使用--force重写已被推送到的任何远程存储库的历史记录),这将特别有用。 - yoniLavi
这正是我遇到的问题,并且需要一些试验和错误才能做到正确。我正在使用的一个人已经将几个大型数据库转储提交到了许多提交中的回购。这就是我在我的例子中使用.sql的原因。我的仓库变得如此臃肿和庞大,以至于github不再接受推动了。 - Jason Glisson
如果您使用的是远程主服务器,则需要强制提交并将其推送 git push --force -u origin master - AlbertMarkovski
@AlbertMarkovski对不起我并不具体。 Github实际上不会接受推送,因为回购超出了他们的规模限制。至少几GB。他们把我拒之门外,并通过电子邮件发送给我。所以,不幸的是,在这一点上,没有任何强迫推动会有所帮助。 - Jason Glisson
@JasonGlisson我也遇到过那个意外将视频添加到存储库的问题。 - AlbertMarkovski


更普遍, 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

23
2018-01-12 08:21



对于更复杂的事情,我发现 git help 令人困惑,但它对简单的事情有好处:) - James Polley
对于git noobs来说实际上并不是那么好,因为“index”并不是git noobs熟悉的概念。我说自己是个git noob的个人经历:)此外,我觉得这样说不那么令人困惑 rm  分阶段删除文件 而不是 从索引中删除 (虽然它对于新手来说仍然毫无意义)。 - Roman Starkov
同意romkyns:描述“从工作树和索引中删除文件”对我来说听起来不像是一种从repo中删除文件的方法。也许如果我更好地理解git它会。相反,它听起来像你只是取消暂存文件(并可选择从工作树中删除它们 - 这是否会影响回购?) - LarsH


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

git rm -r foldername

23
2018-04-17 15:41





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

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

如果要从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"
    

10
2018-03-20 12:13