从Git存储库中删除文件而不从本地文件系统中删除它

mve*_*man 2892 git repository remote-server delete-file git-rm

我的初始提交包含一些日志文件.我已添加*log到我的.gitignore,现在我想从我的存储库中删除日志文件.

git rm mylogfile.log
Run Code Online (Sandbox Code Playgroud)

将从存储库中删除文件,但也将从本地文件系统中删除它.

如何在删除文件的本地副本的情况下从存储库中删除此文件?

bdo*_*lan 4127

对于单个文件:

git rm --cached mylogfile.log
Run Code Online (Sandbox Code Playgroud)

对于单个目录:

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

  • 也许是因为它不像`--keep-local`那样自我解释. (139认同)
  • 但是我如何保留远程服务器上的文件?这保留了我的本地服务器,但是如果我从另一台服务器推送和拉取,该文件将被删除.我还为该文件添加了一个.gitignore,但它仍然被删除了 (103认同)
  • 值得注意的是,在回答中运行命令之后,你需要使用`git commit -m"提交消息"`和`git push`.如果您有任何其他阶段性更改(使用`git status`检查),它们也将在此时提交.@GabrielStaples (6认同)
  • 如果你在`git rm`后面的提交后面,这仍然会删除`git pull`上的文件 (5认同)
  • 由于这是最常被接受的答案而且没有做到,所要求的是,我将告诉我的工作.我使用命令`git rm --cached mylogfile.log`并从存储库中删除该文件.为了避免丢失生产系统上的文件,我会对文件进行备份并在此之后进行拉取.如前所述,文件被删除,需要从备份中复制回来.这是一个非常痛苦,但我发现没有更好的解决方案来解决这个问题. (5认同)
  • 对于那些错过了 OP 已添加到 .gitignore 的问题的人,请注意,这是确保本地文件在以后的合并或拉取过程中不会被删除的必要步骤。您可能会发现这个答案也很有帮助:/sf/answers/2252748011/ (4认同)
  • 也许不是`git rm --cached mylogfile.log`它应该是`git rm --unstage mylogfile.log`以获得更多许可. (3认同)
  • 通过切换到其他分支,文件被删除. (3认同)
  • 哇,该手册页条目中的语言非常复杂。——我本来可以读三遍,但没有意识到它与这个主题相关。 (2认同)
  • @BrainSlugs83 这就是给你的 git! (2认同)
  • 警告:如果您使用此方法,这些文件将从同一存储库的任何其他克隆中删除。它们只会保留在您的本地安装中。例如,如果您有一个实时生产服务器和一个本地开发服务器,从缓存中删除将影响您的生产服务器。 (2认同)

Sam*_*son 265

要从repo中删除整个文件夹(如Resharper文件),请执行以下操作:

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

我已经提交了一些resharper文件,并且不希望这些文件持续存在于其他项目用户.

  • 仅为未来访问者添加注释:不要使用GUI将提交"同步"回到回购.这会将文件拉回到您的本地仓库.你必须做一个`Git Push repo branch`来实际删除远程文件. (13认同)

nul*_*ull 192

您还可以根据.gitignore从存储库中删除文件,而不从本地文件系统中删除它们:

git rm --cached `git ls-files -i -X .gitignore`
Run Code Online (Sandbox Code Playgroud)

或者,在Windows Powershell上:

git rm --cached $(git ls-files -i -X .gitignore)
Run Code Online (Sandbox Code Playgroud)

  • 如果您使用Git Bash而不是cmd-console,则可在Windows上运行 (16认同)
  • 喜欢这个.工作,除了我有一些文件最终在文件名中有空格.我在这里修改了解决方案:`git ls-files -i -X .gitignore | xargs -I {} git rm --cached"{}"`.请考虑在此处修改或添加此解决方案,因为它是一个很好的工具... (16认同)
  • 在Windows上不起作用.git ls-files -i -X .gitignore有效,但我不知道如何将文件发送到'git rm'.你知道怎么做吗? (7认同)
  • 这个建议在 powershell 中非常有效: git rm --cached $(git ls-files -i -X .gitignore) (2认同)

eir*_*ios 81

根据我的答案:https://stackoverflow.com/questions/6313126/how-to-remove-a-directory-in-my-github-repository

要仅从git存储库中删除文件夹/目录或文件,而不是从本地尝试3个简单的步骤.


删除目录的步骤

git rm -r --cached File-or-FolderName
git commit -m "Removed folder from repository"
git push origin master
Run Code Online (Sandbox Code Playgroud)

在下次提交中忽略该文件夹的步骤

要在下次提交时忽略该文件夹,请在根目录中创建一个名为.gitignore的文件 ,并将该文件夹名称放入其中.您可以根据需要添加任意数量

.gitignore文件将如下所示

/FolderName
Run Code Online (Sandbox Code Playgroud)

删除目录

  • 当其他人拉下您的更改时,这会删除他们的本地文件吗? (4认同)

BoD*_*BoD 68

此外,如果您提交了敏感数据(例如包含密码的文件),则应将其从存储库的历史记录中完全删除.以下是解释如何执行此操作的指南:http: //help.github.com/remove-sensitive-data/

  • 此答案应包括完成此任务所需的命令,而不是链接到其他网站. (10认同)
  • 链接已失效,这就是为什么您总是将信息放在帖子中而不是仅仅链接到外部网站。 (2认同)

mAs*_*pEE 61

更通用的解决方案:

  1. 编辑.gitignore文件.

    ECHO mylogfile.log >> .gitignore

  2. 从索引中删除所有项目.

    git rm -r -f --cached .

  3. 重建索引.

    git add .

  4. 进行新的提交

    git commit -m "Removed mylogfile.log"

  • 我的问题不是github - 它是_文件实际上会在他们拉动时从同事中删除.我_don't_想要删除该文件.这给我带来了巨大的问题.所以我想知道是否真的有一个解决方案真的_不能删除文件.另请参见评论小组接受的答案:http://stackoverflow.com/questions/1143796/git-remove-a-file-from-the-repository-without-deleting-it-from-the-local-filesy/20565682 ?noredirect = 1#comment21117138_1143800 (8认同)
  • 来自GitHub?没有.如果你已经推送到github,它将不会从网站上删除它.但它会更新您当地的git存储库. (6认同)
  • 您删除的评论实际上已被删除:)解决方案`rm --cashed`的问题是,当一个人拉动时它最终会删除文件 - 对吗?当他们说"从存储库中删除文件_而不从本地文件系统中删除它"时,这不是人们想要的.现在为什么上面接受的解决方案超出了我的范围 - 可能是OP单独工作而且从未拉过?不知道.我理解github"曾经一直推到那里"的问题 (5认同)
  • 这实际上会删除文件吗? (2认同)

Rys*_*aum 22

Git允许您通过假设它们不变来忽略这些文件.这是通过运行git update-index --assume-unchanged path/to/file.txt命令完成的.一旦标记文件,git将完全忽略该文件的任何更改; 它们不会在运行git status或git diff时出现,也不会被提交.

(来自https://help.github.com/articles/ignoring-files)

因此,不要删除它,而是永远忽略对它的更改.我认为这只适用于本地,所以除非他们运行与上面相同的命令,否则同事仍然可以看到它的变化.(仍然需要验证这一点.)

注意:这不是直接回答问题,而是基于其他答案的评论中的后续问题.

  • 嗯,我这样做,但我发现如果其他人在回购邮件上对其进行了更改,该文件可能会被覆盖. (2认同)

Mic*_*ant 17

忽略文件,从 git 中删除文件,更新 git (用于删除)。

注意:这不涉及敏感信息的历史记录。

这个过程肯定需要对 git 的运行情况有一定的了解。随着时间的推移,我学会了执行以下流程:

1)忽略文件

  • 添加或更新项目.gitignore以忽略它们 - 在许多情况下,例如您的情况,父目录,例如log/将是要使用的正则表达式。
  • 提交并推送该.gitignore文件更改(不确定是否需要推送,如果完成也没有什么坏处)。

2) 从 git 中删除文件(仅)。

  • 现在(仅)从 git 中删除文件git rm --cached some_dir/
  • 检查它们是否仍然留在本地(它们应该!)。

3)添加并提交该更改(本质上,这是对“添加”删除内容的更改,尽管“添加”命令令人困惑!)

  • git add .
  • git commit -m"removal"


Afr*_*mad 12

如果您只想解开文件而不是从本地和远程仓库中删除,请使用以下命令:

git update-index --assume-unchanged  file_name_with_path
Run Code Online (Sandbox Code Playgroud)

  • 虽然这是一个很好的答案,但重要的是要注意,这并不“取消跟踪”文件,因为人们通常在 Git 中使用该词,其中未跟踪的文件是指不在存储库历史记录中且从未出现过的文件。 。这个答案的作用是将文件保留在存储库中,但阻止 Git 注意到对其进行了更改。这有一些显着的差异 - 最重要的是,该文件仍然对其他人存在,如果其他人对其进行更改并且您拉取,则您的本地副本可能会被覆盖而无需确认。 (4认同)

Mar*_*ens 6

以上答案对我不起作用.我曾经filter-branch删除所有提交的文件.

使用以下命令从git存储库中删除文件:

git filter-branch --tree-filter 'rm  file'
Run Code Online (Sandbox Code Playgroud)

使用以下命令从git存储库中删除文件夹:

git filter-branch --tree-filter 'rm -rf directory'
Run Code Online (Sandbox Code Playgroud)

这将从所有提交中删除目录或文件.

您可以使用以下命令指定提交:

git filter-branch --tree-filter 'rm -rf directory' HEAD
Run Code Online (Sandbox Code Playgroud)

或范围:

git filter-branch --tree-filter 'rm -rf vendor/gems' t49dse..HEAD
Run Code Online (Sandbox Code Playgroud)

要将所有内容推送到远程,您可以:

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

  • 这与'git rm -r --cached NAME`结合使用是将其从本地git repo中删除的技巧,并防止它影响以后拉的人(通过从git中删除文件或目录的历史记录). (2认同)

Zah*_*han 6

我想添加@bdonlan已接受的答案。


不要使用此答案来删除远程上存在的文件。

git rm --cached filename
Run Code Online (Sandbox Code Playgroud)

答案应该做什么?

它应该从本地暂存区域中删除您在之前的某些提交中错误提交的一些文件。

  1. 并且还没有推送到远程。
  2. 如果远程推送,其他人就不会关心这些变化。

它将文件从“已跟踪” “未跟踪”状态移动,我的意思是,它删除文件并再次添加它们。

所以,git 不再了解它们了。


可能会出什么问题?

在远程,存在诸如 之类的东西,并且会导致严重破坏。


为什么?

与团队协作时,如果您对远程进行此类更改,它将删除远程上的这些更改以及所有使用 from 的团队。

摘要:您从暂存中删除文件然后推送它们将导致协作团队的本地存储库上的文件也被删除(,将是。)

  • 如果没有替代解决方案,这是一个(非常重要的)评论,但不是答案。 (4认同)