如何从git repo中删除文件?

我已经将一个名为 "file1.txt" 的文件添加到git repo中 . 之后我提交了它,添加了几个名为 dir1dir2 的目录,并将它们提交给git repo .

现在当前的回购有 "file1.txt"dir1dir2 .
如何删除 "file1.txt" 而不影响 dir1dir2 等其他人?

回答(18)

3 years ago

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

3 years ago

git rm file.txt 从repo中删除文件但 also deletes it from the local file system .

要从repo中删除文件并 not 从本地文件系统中删除它,请使用:
git rm --cached file.txt

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

下面的示例输出来自我刚刚发生的事情,我无意中删除了 .003 文件 . 值得庆幸的是,我并不关心 .003 本地副本发生了什么,但是其他一些当前更改的文件是我刚刚对网站所做的更新,并且会在本地文件系统上删除史诗! "Local file system" =直播网站(不是很棒的做法,但却是现实) .

[~/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]$

Update: 这个答案正在增加一些流量,所以我想我会提到我的other Git answer分享了几个很棒的资源:This page有一个图形可以帮助我揭开Git的神秘面纱 . "Pro Git" book is online并帮了我很多忙 .

3 years ago

如果您的文件已经在GitHub上,you now (July 2013) can直接从Web GUI删除它!

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

delete button

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

commit a deletion

就这样,它已经消失了 . 有关这些功能的帮助,请务必阅读有关创建,移动,重命名和删除文件的帮助文章 . 注意:由于它是一个版本控制系统,如果您以后需要恢复该文件,Git总会退缩 .

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

见“Restore a deleted file in a Git repo” .

3 years ago

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

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

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

3 years ago

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

git rm -r foldername

3 years ago

更一般地说, 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

3 years ago

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

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

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

  • 如果文件没有在索引中暂存更改:
bykov@gitserver:~/temp> git rm file1.txt
bykov@gitserver:~/temp> git commit -m "remove file1.txt"
  • 如果文件在索引中进行了更改:
bykov@gitserver:~/temp> git rm -f file1.txt
bykov@gitserver:~/temp> git commit -m "remove file1.txt"

3 years ago

git rm 将仅从现在开始删除此分支上的文件,但它仍保留在历史记录中,git将记住它 .

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

但是,即使这样做,git也能记住它,因为在reflog,remotes,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中的此文件 .

3 years ago

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

rm file1.txt

git commit -a -m "Deleting files"

git push origin master

3 years ago

删除特定文件

git rm文件名

以单次递归方式从目录中清除所有未跟踪文件

git clean -fdx

3 years ago

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

  • 单击“同步” .

  • 单击文件所在的目录,然后选择最新版本的文件 .

  • 点击工具并选择"Open a shell here."

  • 在shell中,键入:"rm "并按Enter键 .

  • 提交更改并重新同步 .

3 years ago

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

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

后来这个文件被忽略了

3 years ago

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

git rm -r文件名

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

git rm --cached文件名

  • 其次,将更改提交到本地存储库 .
git commit -m "unwanted files or some inline comments"
  • 最后,将本地更改更新/推送到远程存储库 .
git push

3 years ago

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

  • 将整个本地回购搬到其他地方

  • 再次从主服务器到本地驱动器克隆存储库

  • 将文件/文件夹从#1中的原始副本复制回#2中的新克隆

  • 确保.gitignore文件中不存在或排除问题大文件

  • 做通常的git add / git commit / git push

3 years ago

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

git rm --cached file1.txt

如果要从硬盘中删除:

git rm file1.txt

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

git rm -r foldername

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

git rm -r parentFolder/childFolder

然后,你可以照常 commitpush . 但是,如果要恢复已删除的文件夹,可以按照以下步骤操作:recover deleted files from git is possible.

来自doc:git rm [-f | --force] [-n] [-r] [--cached] [--ignore-unmatch] [--quiet] [ - ] <file> ...
选项<file> ...要删除的文件 . 可以给出Fileglobs(例如* .c)来删除所有匹配的文件 . 如果你想让Git扩展文件glob字符,你
可能需要shell逃脱它们 . 可以给出一个前导目录名(例如,删除dir / file1和dir / file2的目录)以删除目录中的所有文件,并递归所有子目录,但这需要显式给出-r选项 . -f --force覆盖最新检查 .
-n --dry-run实际上不删除任何文件 . 相反,只显示它们是否存在于索引中,否则将被命令删除 .
-r在给出前导目录名时允许递归删除 .

  • 此选项可用于将命令行选项与文件列表分开(当文件名可能被误认为时非常有用)
    命令行选项) . --cached使用此选项仅从索引中取消暂存和删除路径 . 无论是否修改了工作树文件,都将保持不变 .
    --ignore-unmatch即使没有文件匹配,也退出状态为零 .
    -q --quiet git rm通常为每个删除的文件输出一行(以rm命令的形式) . 此选项会抑制输出 .

Read more on official doc.

3 years ago

我有obj和bin文件意外地进入了我不想污染我的'更改文件'列表的仓库

在我注意到他们去了遥控器后,我通过将其添加到 .gitignore 来忽略它们

/*/obj
/*/bin

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

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

在命令提示符中:

  • CD到repo文件夹(即 C:\repos\MyRepo

  • 我想删除SSIS \ obj . 看来你只能在顶层删除,所以你现在需要把CD转成SSIS :(即 C:\repos\MyRepo\SSIS

  • 现在输入魔法咒语 git rm -r -f obj

  • rm =删除

  • -r =递归删除

  • -f =意味着力量,因为你真的是指它

  • obj是文件夹

  • 现在运行 git commit -m "remove obj folder"

我收到一条惊人的消息,说13个文件改变了315222删除

然后因为我不想查看CMD行,我进入Visual Sstudio并进行同步将其应用到远程

3 years ago

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

3 years ago

如果你没有在你的本地仓库中存档但是在git repo中,那么只需通过web界面在git repo中打开文件,然后在界面的右上角找到删除按钮 . Click Here, To view interface Delete Option