2312

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

现在当前存储库有"file1.txt"dir1dir2. 我怎样才能"file1.txt"在不影响其他人的情况下删除,比如dir1and dir2

4

24 回答 24

3849

使用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
于 2010-01-12T07:52:32.037 回答
636

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”一书在网上,对我帮助很大。

于 2013-05-25T20:26:18.927 回答
100

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

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

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

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

然后git pull在您的本地仓库中使用“”,这也会在本地删除文件。
这使得这个答案成为从 git repo 中删除文件的(迂回)方式?
(更不用说 GitHub 上的文件在 git repo”中)


删除按钮

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

提交删除

就这样,它消失了。

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

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

最后一句意味着被删除的文件仍然是历史的一部分,你可以很容易地恢复它(但还不能通过 GitHub Web 界面):

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

于 2013-07-04T20:53:07.930 回答
79

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

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

注意:将 *.sql 替换为您的文件名或文件类型。要非常小心,因为这将通过每个提交并撕掉这个文件类型。

编辑:注意-在此命令之后您将无法推送或拉取-您将看到拒绝“无关历史”您可以使用“git push --force -u origin master”进行推送或拉取

于 2015-02-27T19:29:16.057 回答
39

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

git rm -r foldername
于 2015-04-17T15:41:42.657 回答
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
于 2010-01-12T08:21:03.960 回答
16

如果您想从 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"
    
于 2015-03-20T12:13:15.093 回答
14

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

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

但是,即使在这样做之后,git 仍然可以记住它,因为在 reflog、remote、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 中的这个文件。

于 2017-01-23T12:56:04.483 回答
11
于 2018-10-07T02:57:14.077 回答
10

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

rm file1.txt

git commit -a -m "Deleting files"

git push origin master
于 2015-10-06T03:07:44.597 回答
8

根据文档

git rm --cached file1.txt

当涉及到敏感数据时——最好不要说你删除了文件,而只是将它包含在最后一次已知的提交中:

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
于 2020-05-16T21:08:18.913 回答
8

由Johannchopin编辑的Greg Hewgill的答案对我有帮助,因为我并不关心完全从历史记录中删除文件。就我而言,它是一个目录,所以我所做的唯一更改是使用:

git rm -r --cached myDirectoryName

而不是“git rm --cached file1.txt”..后跟:

git commit -m "deleted myDirectoryName from git"
git push origin branch_name

感谢Greg HewgillJohannchopin

于 2020-10-03T09:14:45.660 回答
7

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

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

后来这个文件被忽略了

于 2016-08-23T12:03:21.613 回答
7

删除特定文件

git rm 文件名

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

git clean -fdx

于 2016-08-23T13:56:08.923 回答
5

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

  • 单击同步。
  • 单击文件所在的目录,然后选择文件的最新版本。
  • 单击工具并选择“在此处打开外壳”。
  • 在 shell 中,输入:“rm {filename}”并回车。
  • 提交更改并重新同步。
于 2013-03-14T15:15:21.120 回答
3

转到您的项目目录并输入:

git filter-branch --tree-filter 'rm -f <deleted-file>' HEAD

之后 push --force 从所有提交中删除文件。

git push origin --force --all
于 2020-09-30T00:52:58.730 回答
3
  1. 首先,从本地存储库中删除文件。

    git rm -r 文件名

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

    git rm --cached 文件名

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

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

    git push 
    
于 2016-10-18T04:00:50.167 回答
2

对于git rm不够用并且需要从历史记录中删除文件的情况:由于git filter-branch手册页现在本身建议使用git-filter-repo,而我今天必须这样做,这里有一个使用该工具的示例。它使用示例 repohttps://example/eguser/eg.git

  1. 将存储库克隆到新目录git clone https://example/eguser/eg.git

  2. 保留除不需要的文件之外的所有内容。git-filter-repo --path file1.txt --invert-paths

  3. 将远程存储库来源添加回来: git remote add origin https://example/eguser/eg.git。该git-filter-repo工具通过设计删除远程远程信息并建议一个新的远程存储库(见第 4 点)。这对于大型共享存储库是有意义的,但对于像本示例中那样删除单个新添加的文件可能会有点过分。

  4. 当对本地的内容感到满意时,用它替换远程。

    git push --force -u origin master. 由于更改了历史记录,因此需要强制。

在加入和更改存储库历史之前,还要注意链接手册中有关团队和项目动态的有用--dry-run选项和良好讨论。

于 2020-09-07T01:14:24.143 回答
1

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

  1. 将整个本地仓库移到别处
  2. 再次将 repo 从 master 克隆到本地驱动器
  3. 将#1中的原始副本中的文件/文件夹复制回#2中的新克隆中
  4. 确保问题大文件不存在或排除在 .gitignore 文件中
  5. 做通常的 git add/git commit/git push
于 2018-03-21T18:22:23.473 回答
1

只需打开 github 存储库中的文件,您就可以看到 Raw|Blame 旁边的删除图标,并且不要忘记单击提交更改按钮。您可以看到您的文件已被删除。

于 2020-09-03T18:45:58.620 回答
1

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

于 2018-09-30T17:26:37.510 回答
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 并进行了同步以将其应用到遥控器

于 2018-07-27T01:59:15.110 回答
-1

如果您需要从确定的扩展名中删除文件(例如,编译的文件),您可以执行以下操作以一次将它们全部删除:

git remove -f *.pyc
于 2019-10-01T05:21:42.593 回答
-7

如果你不是在本地仓库而是在 git repo 中归档,那么只需通过 web 界面在 git repo 中打开文件,然后在界面右上角找到删除按钮。 点击这里,查看界面删除选项

于 2016-11-30T15:47:09.240 回答