如何从git repo中删除文件?

web*_*org 1795 git git-rm

我添加了一个名为"file1.txt"git repo 的文件.从那以后,我犯了,增加了几个目录,名称dir1dir2,并承诺他们混帐回购协议.

现在当前的回购有"file1.txt",dir1dir2.
我怎样才能删除"file1.txt",而不会影响其他人一样dir1dir2

Gre*_*ill 2971

用途git rm:

git rm file1.txt
git commit -m "remove file1.txt"
Run Code Online (Sandbox Code Playgroud)

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

git rm --cached file1.txt
git commit -m "remove file1.txt"
Run Code Online (Sandbox Code Playgroud)

并将更改推送到远程仓库

git push origin branch_name  
Run Code Online (Sandbox Code Playgroud)

  • 也很方便:git rm -r directory //删除目录和内容 (78认同)
  • 请注意,这也将在本地删除该文件.如果您只想从repo中删除它:git rm --cached file1.txt (14认同)
  • 但是,这并不会在其他提交中删除该文件. (9认同)
  • @SaulOrtega:没错.要删除先前提交(改变过去的历史)的文件,看到在GitHub上的帮助页面[删除敏感数据(https://help.github.com/articles/remove-sensitive-data/). (6认同)
  • 值得注意的是,如果该文件包含敏感信息(例如凭据),您应该立即**更改这些凭据**.引用[GitHub](https://help.github.com/articles/remove-sensitive-data/)"一旦你将提交推送到GitHub,你应该考虑它所包含的任何数据被泄露.如果你提交了一个密码,更改它!如果您提交了密钥,请生成一个新密钥." (4认同)
  • git rm 是一个**非常**危险的命令,应该用粗体注释它也会从系统中删除文件。 (2认同)
  • @GregHewgill 如果 `rm` 命令很明显,但 `git rm` 名称可能表明它只是从 git 中删除文件,所以特别是 Windows 用户可能会不小心删除他们宝贵的文件 (2认同)

Chr*_*s K 598

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]$
Run Code Online (Sandbox Code Playgroud)

更新:这个答案正在获得一些流量,所以我想我会提到我的其他Git答案分享了几个很棒的资源:这个页面有一个图形,帮助我揭开Git神秘面纱.在"临Git的"一书是在网上,并帮助了我很多.

  • 然后你需要使用像`git commit -m"之类的东西来提交它.只需删除file1.txt"`然后,如果你有一个远程存储库,请使用类似`git push origin master`之类的东西推送提交. (6认同)

Von*_*onC 69

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

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

删除按钮

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

提交删除

就这样,它已经消失了.

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

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

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

请参阅" 在Git仓库中恢复已删除的文件 ".

  • 这个答案是指github,问题是关于git repo.不是如何使用github接口. (9认同)
  • 你必须滚动到底部并点击"提交更改"以提交删除! (4认同)

Jas*_*son 58

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

git filter-branch -f --index-filter 'git rm --cached --ignore-unmatch *.sql'
Run Code Online (Sandbox Code Playgroud)

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

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

  • 这是一个很好的答案,但请注意,与其他答案相比,此命令会重写提交历史记录并删除与该模式匹配的所有文件的跟踪.如果您发现意外提交了一些敏感信息(如果需要,可以成功使用--force重写已被推送到的任何远程仓库的历史记录),这将特别有用. (8认同)
  • 这正是我遇到的问题,并且需要一些反复试验才能做到正确.我正在使用的一个人已经将几个大型数据库转储提交到了一个回购许多提交的回购.这就是我在我的例子中使用.sql的原因.我的仓库变得如此臃肿和庞大,以至于github不再接受推动了. (3认同)
  • 如果您使用的是远程主服务器,则需要强制提交并使用`git push --force -u origin master`将其推入 (2认同)
  • @AlbertMarkovski对不起,我没有具体。Github实际上不接受推送,因为回购超出了其大小限制。至少几个GB。他们切断了我的联系,并通过电子邮件将其发送给我。因此,不幸的是,此时强制推送无济于事。 (2认同)
  • @JasonGlisson我也遇到过这样的问题,即视频是偶然添加到存储库中的。 (2认同)

Raj*_*aja 33

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

git rm -r foldername
Run Code Online (Sandbox Code Playgroud)

  • 这也从本地删除文件夹!`使用 git rm --cached -r &lt;文件夹名&gt;` (4认同)

Jam*_*ley 24

更一般地说,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
Run Code Online (Sandbox Code Playgroud)

  • 对于git noobs来说实际上并不是那么好,因为"index"并不是git noobs熟悉的概念.我说自己是个git noob的个人经历:)另外,我觉得说'rm`为一个文件删除_而不是从index_中删除_(虽然它对于noobs来说仍然毫无意义)并不那么令人困惑. (9认同)
  • 对于更复杂的事情,我发现'git help`令人困惑,但这对简单的事情有好处:) (5认同)

小智 17

由Johannchopin编辑的Greg Hewgill的答案帮助了我,因为我不关心从历史记​​录中完全删除该文件。就我而言,它是一个目录,因此我所做的唯一更改是使用:

git rm -r --cached myDirectoryName
Run Code Online (Sandbox Code Playgroud)

而不是“git rm --cached file1.txt”..后面是:

git commit -m "deleted myDirectoryName from git"
git push origin branch_name
Run Code Online (Sandbox Code Playgroud)

谢谢格雷格休吉尔约翰肖平


Ale*_*kov 15

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

bykov@gitserver:~/temp> git rm --cached file1.txt
bykov@gitserver:~/temp> git commit -m "remove file1.txt from the repo"
Run Code Online (Sandbox Code Playgroud)

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

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

    bykov@gitserver:~/temp> git rm file1.txt
    bykov@gitserver:~/temp> git commit -m "remove file1.txt"
    
    Run Code Online (Sandbox Code Playgroud)
  2. 如果文件在索引中进行了更改:

    bykov@gitserver:~/temp> git rm -f file1.txt
    bykov@gitserver:~/temp> git commit -m "remove file1.txt"
    
    Run Code Online (Sandbox Code Playgroud)


nac*_*ker 12

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


Tom*_*ran 12

根据文档

\n

git rm --cached file1.txt

\n

当涉及到敏感数据\xe2\x80\x94时,最好不要说您删除了该文件,而只是将其包含在最后一次已知的提交中:

\n

0.修改最后一次提交

\n
git commit --amend -CHEAD\n
Run Code Online (Sandbox Code Playgroud)\n

如果你想从所有 git 历史记录中删除该文件,根据文档你应该执行以下操作:

\n

1. 将其从本地历史记录中删除

\n
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\n# Replace PATH-TO-YOUR-FILE-WITH-SENSITIVE-DATA with the path to the file you want to remove, not just its filename\n
Run Code Online (Sandbox Code Playgroud)\n
    \n
  1. 不要忘记将此文件包含在 .gitignore 中(如果它是您不想共享的文件(例如密码...):
  2. \n
\n
echo "YOUR-FILE-WITH-SENSITIVE-DATA" >> .gitignore\ngit add .gitignore\ngit commit -m "Add YOUR-FILE-WITH-SENSITIVE-DATA to .gitignore"\n
Run Code Online (Sandbox Code Playgroud)\n

3.如果需要从远程删除

\n
git push origin --force --all\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n
git push origin --force --tags\n
Run Code Online (Sandbox Code Playgroud)\n


Suh*_*aib 10

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

rm file1.txt

git commit -a -m "Deleting files"

git push origin master
Run Code Online (Sandbox Code Playgroud)


Bla*_*nka 8

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

git rm --cached file1.txt
Run Code Online (Sandbox Code Playgroud)

如果您也要从硬盘删除:

git rm file1.txt
Run Code Online (Sandbox Code Playgroud)

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

git rm -r foldername
Run Code Online (Sandbox Code Playgroud)

如果要删除另一个文件夹内的文件夹

git rm -r parentFolder/childFolder
Run Code Online (Sandbox Code Playgroud)

然后,您可以commitpush往常一样。但是,如果要恢复已删除的文件夹,可以遵循以下步骤:可以从git恢复已删除的文件。

从文档:

git rm [-f | --force] [-n] [-r] [--cached] [--ignore-unmatch] [--quiet] [--] <file>…?
Run Code Online (Sandbox Code Playgroud)

选项

<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
Run Code Online (Sandbox Code Playgroud)

可能需要对它们进行脱壳。可以指定一个前导目录名称(例如,用于删除dir / file1的dir和dir / file2)来删除目录中的所有文件,以及递归地删除所有子目录,但这需要显式地指定-r选项。 -f --force

Override the up-to-date check.
Run Code Online (Sandbox Code Playgroud)

-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.
Run Code Online (Sandbox Code Playgroud)

-r

Allow recursive removal when a leading directory name is given.
Run Code Online (Sandbox Code Playgroud)

--

This option can be used to separate command-line options from the list of files, (useful when filenames might be mistaken for
Run Code Online (Sandbox Code Playgroud)

命令行选项)。 --cached

Use this option to unstage and remove paths only from the index. Working tree files, whether modified or not, will be left alone.
Run Code Online (Sandbox Code Playgroud)

--ignore-unmatch

Exit with a zero status even if no files matched.
Run Code Online (Sandbox Code Playgroud)

-q --quiet

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

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


Sit*_*esh 7

删除特定文件

git rm文件名

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

git clean -fdx


voi*_*ter 6

/sf/answers/143323421/ /sf/answers/1376667421/ 非常相似,都尝试了。没有什么。Git 不断跟踪该文件。(我使用 vscode,因此文件立即被标记为 U(未跟踪)或 A(已添加))

对整个类别执行此操作/sf/answers/3740180391/可以解决问题。

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

**manually add the file name to .gitignore**

git rm --cached settings.py    
git commit -m "remove settings.py"
git push origin master
git rm -r --cached .
git add .
git commit -m "Untrack files in .gitignore"
Run Code Online (Sandbox Code Playgroud)

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

  • 如果您有新问题,请点击 [提问](/sf/) 按钮提出。如果有助于提供上下文,请包含此问题的链接。- [来自评论](/review/late-answers/32418503) (2认同)

jus*_*ted 5

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

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


小智 5

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

git filter-branch -f --index-filter 'git rm --cached --ignore-unmatch file_name_with_path' HEAD
git push --force -u origin master
Run Code Online (Sandbox Code Playgroud)

后来这个文件被忽略了