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

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

现在,当前存储库具有"file1.txt"dir1dir2 。如何删除"file1.txt"而不影响其他用户,如dir1dir2

答案

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

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 神秘化。 “Pro Git” 书在线上对我有很大帮助。

首先,如果您正在使用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 存储库中还原已删除的文件 ”。

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

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

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

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

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

git rm -r foldername

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

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

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"

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

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

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

rm file1.txt

git commit -a -m "Deleting files"

git push origin master

注意:如果您只想从 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.

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