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

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

现在,当前存储库具有"file1.txt"dir1dir2 。 如何在不影响其他内容的情况下删除"file1.txt" ,例如dir1dir2


#1楼

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

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

#2楼

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”这本书是在线的 ,对我帮助很大。


#3楼

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

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

然后在你的本地仓库上“ git pull ”,这也将在本地删除该文件。
这使得这个答案成为一种从git repo删除文件的方法(迂回)?
(且不说在GitHub上一个文件在“混帐回购协议”)


删除按钮

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

提交删除

就这样,它已经消失了。

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

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

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

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


#4楼

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

#5楼

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

#6楼

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

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

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

编辑:注意 - 在这个命令后你将无法推或拉 - 你会看到拒绝'无关历史'你可以使用'git push --force -u origin master'来推或拉


#7楼

如果要从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" 

#8楼

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

git rm -r foldername

#9楼

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

rm file1.txt

git commit -a -m "Deleting files"

git push origin master

#10楼

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

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

后来这个文件被忽略了


#11楼

删除特定文件

git rm文件名

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

git clean -fdx


#12楼

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

    git rm -r文件名

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

    git rm --cached文件名

  2. 其次,Commit更改为本地存储库。

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

     git push 

#13楼

如果你没有在你的本地仓库中存档但是在git repo中,那么只需通过web界面在git repo中打开文件,然后在界面的右上角找到删除按钮。 单击此处,查看界面删除选项


#14楼

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中的此文件。


#15楼

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

  1. 把整个当地的回购搬到其他地方
  2. 从主服务器再次将repo克隆到本地驱动器
  3. 将文件/文件夹从#1中的原始副本复制回#2中的新克隆
  4. 确保.gitignore文件中不存在或排除问题大文件
  5. 做通常的git add / git commit / git push

#16楼

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

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

/*/obj
/*/bin

问题是它们已经在遥控器中,当它们被更改时,它们会弹出更改并污染已更改的文件列表。

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

在命令提示符中:

  1. CD到repo文件夹(即C:\\repos\\MyRepo
  2. 我想删除SSIS \\ obj。 看来你只能在顶级删除,所以你现在需要把CD放入SSIS :(即C:\\repos\\MyRepo\\SSIS
  3. 现在输入magic incantation git rm -r -f obj
    • RM =除去
    • -r =递归删除
    • -f =意味着力量,因为你真正的意思
    • obj是文件夹
  4. 现在运行git commit -m "remove obj folder"

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

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


#17楼

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


#18楼

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

OPTIONS

<file>…​

 Files to remove. Fileglobs (eg *.c) can be given to remove all matching files. If you want Git to expand file glob characters, you 

可能需要shell逃脱它们。 可以给出一个前导目录名(例如删除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. 

--

 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. 

- 忽略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. 

阅读官方文档的更多内容。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值