关于git rm:如何从git repo中删除文件?

How can I delete a file from git repo?

我在git repo中添加了一个名为"file1.txt"的文件。在此之后,我提交了一个名为dir1dir2的目录,并提交给gitrepo。

目前回购有"file1.txt"dir1dir2。我如何删除"file1.txt",而不影响其他人,如dir1dir2


使用git rm

1
2
git rm file1.txt
git commit -m"remove file1.txt"

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

1
2
git rm --cached file1.txt
git commit -m"remove file1.txt"

并推动对远程回购的更改

1
git push origin branch_name


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

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

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
[~/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"这本书是在线的,对我有很大帮助。


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

Simply view any file in your repository, click the trash can icon at the top, and commit the removal just like any other web-based edit.

然后在您的本地repo上显示"git pull",这也将在本地删除该文件。这使得这个答案成为从gitrepo中删除文件的一种(迂回)方式?(更不用说GitHub上的文件位于"Git回购"中)

delete button

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

commit a deletion

And just like that, it’s gone.

For help with these features, be sure to read our help articles on creating, moving, renaming, and deleting files.

Note: Since it’s a version control system, Git always has your back if you need to recover the file later.

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

请参见"在git repo中还原已删除的文件"。


这是我唯一的选择。

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

注意:用文件名或文件类型替换*.sql。要非常小心,因为这将经历每一次提交,并撕掉这个文件类型。

编辑:注意-在这个命令之后,您将无法推或拉-您将看到"无关历史"的拒绝,您可以使用"git push--force-u origin master"推或拉


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

1
git rm -r foldername

一般来说,git help至少有助于解决以下简单问题:

1
2
3
4
5
6
7
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


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

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

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

  • 如果文件在索引中没有阶段性更改:

    1
    2
    bykov@gitserver:~/temp> git rm file1.txt
    bykov@gitserver:~/temp> git commit -m"remove file1.txt"
  • 如果文件在索引中有阶段性更改:

    1
    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、remotes、tags等中可以引用它。

    如果你想一步就把它完全抹掉,我建议你使用git forget-blob

    Completely remove a file from a git repository with git forget-blob

    这很简单,只需做一次git forget-blob file1.txt

    这将删除所有引用,执行git filter-branch,最后运行git垃圾收集器git gc,以完全消除您的repo中的此文件。


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

    1
    2
    3
    4
    5
    rm file1.txt

    git commit -a -m"Deleting files"

    git push origin master

    删除特定文件

    git rm filename

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

    git clean -fdx


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

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


    在我的例子中,我尝试在提交几次之后删除GitHub上的文件,但保存在计算机上

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

    后来这个文件被忽略了


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

    1
    git rm --cached file1.txt

    如果还要从硬盘中删除:

    1
    git rm file1.txt

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

    1
    git rm -r foldername

    如果要删除其他文件夹中的文件夹

    1
    git rm -r parentFolder/childFolder

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

    From doc:

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

    OPTIONS

    …?

    1
    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

    may need to shell-escape them. A leading directory name (e.g. dir to
    remove dir/file1 and dir/file2) can be given to remove all files in
    the directory, and recursively all sub-directories, but this requires
    the -r option to be explicitly given.
    -f
    --force

    1
    Override the up-to-date check.

    -n
    --dry-run

    1
    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

    1
    Allow recursive removal when a leading directory name is given.

    --

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

    command-line options).
    --cached

    1
    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

    1
    Exit with a zero status even if no files matched.

    -q
    --quiet

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

    阅读更多官方文件。


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


    git rm -r File-Name

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

    git rm --cached File-Name

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

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

    1
    git push

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

  • 将整个本地回购交易转移到其他地方
  • 再次将repo从master克隆到本地驱动器
  • 将文件/文件夹从1中的原始副本复制回2中的新克隆
  • 确保问题大文件不存在或排除在.gitignore文件中
  • 执行常见的git add/git commit/git push

  • 我有obj和bin文件,它们意外地进入repo,我不想污染我的"更改文件"列表。

    当我注意到他们去了偏僻的地方,我就把这个加在了.gitignore上,忽略了他们。

    1
    2
    /*/obj
    /*/bin

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

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

    在命令提示中:

  • CD到repo文件夹(即C:
    epos\MyRepo
    )
  • 我要删除ssisobj。似乎您只能在顶层删除,所以现在需要CD到ssis中:(即C:
    epos\MyRepo\SSIS
    )
  • 现在输入魔法咒语git rm -r -f obj
    • 删除=
    • -R=递归删除
    • -F=意味着力量,因为你真的是认真的。
    • obj是文件夹
  • 现在运行git commit -m"remove obj folder"
  • 我收到一条警告消息说13个文件更改了315222个删除

    然后因为我不想查找命令行,我进入Visual sstudio并进行了同步,将其应用到远程


    使用git rm从repo中删除文件后,可以使用bfg repo cleaner完全轻松地从repo历史中删除该文件。


    如果您不在本地回购中归档,而是在Git回购中归档,那么只需通过Web界面在Git回购中打开文件,然后在界面的右角找到删除按钮。单击此处查看界面删除选项