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

如何从我的存储库中删除"file1.txt"

3054019 次浏览

使用#0

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

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

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

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

并将更改推送到远程存储库

git push origin branch_name

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

zhasper@berens:/media/Kindle/documents$ git helpusage: 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

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

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

git rm file.txt从存储库中删除文件,但也会从本地文件系统中删除它

要从存储库中删除文件并没有从本地文件系统中删除它,请使用:
git rm --cached file.txt

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

下面的示例输出来自刚刚发生在我身上的事情,我无意中删除了.003文件。谢天谢地,我不在乎.003的本地副本发生了什么,但其他一些当前更改的文件是我刚刚对网站进行的更新,如果在本地文件系统上被删除,那将是史诗般的!“本地文件系统”=实时网站(不是一个伟大的实践,但这是现实)

[~/www]$ git rm shop/mickey/mtt_flange_SCN.7z.003error: '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.003rm '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.002rm '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》已上线对我帮助很大。

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

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

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

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

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


删除按钮

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

删除文件

就这样,它消失了。

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

注意:由于它是一个版本管理系统,如果您稍后需要恢复文件,Git始终支持您。

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

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

这是唯一为我工作的选择。

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

注意:将*. sql替换为您的文件名或文件类型。要非常小心,因为这将遍历每次提交并删除此文件类型。

编辑:注意-在这个命令之后,你将无法推或拉-你会看到'无关历史'的拒绝,你可以使用'git推送--force-u起源大师'来推或拉

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

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

如果您想从存储库和文件系统中删除文件,那么有两种选择:

  1. 如果文件在索引中没有暂存更改:

    bykov@gitserver:~/temp> git rm file1.txtbykov@gitserver:~/temp> git commit -m "remove file1.txt"
  2. If the file has changes staged in the index:

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

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

git rm -r foldername

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

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

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

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

后来这个文件被忽略了

删除特定文件

git rm文件名

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

git Clean-fdx运行环境

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

    git rm-r文件名

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

    git rm--缓存文件名

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

    git commit -m "unwanted files or some inline comments"
  3. Finally, update/push local changes into remote repository.

    git push

如果您不在本地仓库中归档,而是在git仓库中归档,则只需通过Web界面在git仓库中打开文件,并在界面右上角找到删除按钮。单击此处,查看界面删除选项

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

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

但是,即使这样做之后,git也可以记住它,因为在reflg、远程数据库、标签等中可以引用它。

如果你想在一个步骤中完全消除它,我建议你使用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以完全摆脱存储库中的此文件。

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

  1. 将整个本地存储库迁移到其他地方
  2. 从主驱动器再次克隆存储库到本地驱动器
  3. 将文件/文件夹从#1中的原始副本复制回#2中的新克隆
  4. 确保问题大文件不存在或排除在. gitignore文件中
  5. 执行通常的git add/git提交/git推送

我有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 Sdios并执行Sync以将其应用于远程

使用git rm从存储库中删除文件后,您可以使用BFG回收清洁剂从存储库历史记录中完全轻松地删除文件。

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

git rm --cached file1.txt

如果您也想从硬盘中删除:

git rm file1.txt

如果您想删除一个文件夹(该文件夹可能包含很少的文件),那么您应该使用递归命令删除,如下所示:

git rm -r foldername

如果您想删除另一个文件夹中的文件夹

git rm -r parentFolder/childFolder

然后,您可以像往常一样commitpush。但是,如果您想恢复已删除的文件夹,您可以按照以下操作:从git恢复已删除的文件是可能的。

摘自doc:

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

可能需要shell转义它们。前导目录名称(例如dir to删除dir/file1和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.

#0

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.

#设置不匹配

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.

阅读更多关于官方文档。

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

git remove -f *.pyc

根据留档

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" >> .gitignoregit add .gitignoregit commit -m "Add YOUR-FILE-WITH-SENSITIVE-DATA to .gitignore"

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

git push origin --force --all

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

git push origin --force --tags

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

对于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.gitgit-filter-repo工具通过设计删除远程远程信息并建议一个新的远程存储库(参见第4点)。这对于大型共享存储库是有意义的,但对于像本例中那样删除单个新添加的文件来说可能是多余的。

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

    git push --force -u origin master.由于更改的历史,需要强制。

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

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

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

之后,推送--force从所有提交中删除文件。

git push origin --force --all

约翰肖邦编辑的Greg Hewgill的答案帮助了我,因为我不在乎完全从历史中删除文件。在我的情况下,它是一个目录,所以我所做的唯一更改是使用:

git rm -r --cached myDirectoryName

而不是"git rm--cachefile1.txt"…然后是:

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

谢谢Greg Hewgill约翰肖邦

如果您的文件是敏感的(例如,您意外添加和提交的设置或密钥),那么您可以将其从所有版本中删除。

要从所有版本中删除,请使用以下命令(警告:小心,因为如果没有副本,您将无法恢复存储库中已删除的文件):

  1. 使用Git
git filter-branch --index-filter 'git rm -rf --cached --ignore-unmatch file.ext' HEAD
  1. 使用git-filter-repo(获取这里,Git推荐的新方法)
git filter-repo --path file.ext

https://stackoverflow.com/a/2047477/14508423https://stackoverflow.com/a/19666677/14508423非常相似,都试过了。没有。Git一直在跟踪文件。(我使用vscode,所以文件立即被标记为U(未跟踪)或A(添加))

对整个类别执行此https://stackoverflow.com/a/53431148/14508423解决了问题。

这样做可以从git中删除文件并让git忘记它:

**manually add the file name to .gitignore**
git rm --cached settings.pygit commit -m "remove settings.py"git push origin mastergit rm -r --cached .git add .git commit -m "Untrack files in .gitignore"

ps:每次失败时,我都尝试删除带有敏感信息的文件,例如令牌(. env和settings.py文件)。但它可以很好地处理随机文件

2022年有效的新答案。

不要使用:

git filter-branch

此命令在推送后可能不会更改远程存储库。如果您在使用它后克隆,您会看到什么都没有改变,存储库仍然很大。此命令现在很旧。例如,如果您使用https://github.com/18F/C2/issues/439中的步骤,这将无法工作。

你需要使用

git filter-repo

步骤:

(1)查找. git中最大的文件:

git rev-list --objects --all | grep -f <(git verify-pack -v  .git/objects/pack/*.idx| sort -k 3 -n | cut -f 1 -d " " | tail -10)

(2)Strat过滤这些大文件:

 git filter-repo --path-glob '../../src/../..' --invert-paths --force

 git filter-repo --path-glob '*.zip' --invert-paths --force

 git filter-repo --path-glob '*.a' --invert-paths --force

或第一步,你会发现什么?

(3)

 git remote add origin git@github.com:.../...git

(4)

git push --all --force
git push --tags --force

成交!