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

时间:2009-07-17 14:56:44

标签: git repository remote-server delete-file git-rm

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

git rm mylogfile.log

将从存储库中删除文件,但也会将其从本地文件系统中删除。

如何在没有删除文件的本地副本的情况下从repo 中删除此文件?

12 个答案:

答案 0 :(得分:3936)

来自man文件:

  

当给出--cached时,分阶段内容必须与分支的尖端或磁盘上的文件匹配,从而允许仅从索引中删除文件。

因此,对于单个文件:

git rm --cached mylogfile.log

和单个目录:

git rm --cached -r mydirectory

答案 1 :(得分:260)

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

git rm -r --cached folderName

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

答案 2 :(得分:185)

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

git rm --cached `git ls-files -i -X .gitignore`

或者,在Windows Powershell上:

git rm --cached $(git ls-files -i -X .gitignore)

答案 3 :(得分:74)

根据我的答案: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

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

  

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

.gitignore 文件将如下所示

/FolderName

remove directory

答案 4 :(得分:67)

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

答案 5 :(得分:59)

更通用的解决方案:

  1. 修改.gitignore个文件。

    ECHO mylogfile.log >> .gitignore

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

    git rm -r -f --cached .

  3. 重建索引。

    git add .

  4. 进行新提交

    git commit -m "Removed mylogfile.log"

答案 6 :(得分:21)

  

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

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

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

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

答案 7 :(得分:8)

如果只想取消跟踪文件,而不是从本地和远程回购中删除,请使用以下命令:

git update-index --assume-unchanged  file_name_with_path

答案 8 :(得分:5)

以上答案对我没有用。我使用filter-branch删除了所有已提交的文件。

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

git filter-branch --tree-filter 'rm  file'

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

git filter-branch --tree-filter 'rm -rf directory'

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

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

git filter-branch --tree-filter 'rm -rf directory' HEAD

或范围:

git filter-branch --tree-filter 'rm -rf vendor/gems' t49dse..HEAD

要将所有内容推送到远程,您可以执行以下操作:

git push origin master --force

答案 9 :(得分:0)

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

注意:这不会处理敏感信息的历史记录。

此过程肯定需要对git进行一些了解。随着时间的流逝,我已经学会了执行以下过程:

1)忽略文件

  • 添加或更新项目.gitignore以忽略它们-在许多情况下,例如您的父目录,例如log/将成为要使用的正则表达式。
  • 提交并推送.gitignore文件更改(不确定是否需要推送就可以了,完成后不会造成任何伤害)。

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

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

3)添加并提交所做的更改(本质上,这是对“添加”删除内容的更改,尽管否则会造成混乱的“添加”命令!)

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

答案 10 :(得分:0)

这取决于您从git中“删除”的含义。 :)

您可以使用git rm --cached see for more details取消暂存文件。取消暂存时,意味着不再对其进行跟踪,但这不会从以前的提交中删除该文件。

如果您想做更多的工作,例如从所有先前的提交中删除敏感数据,则需要使用BFG Repo-Cleaner之类的工具来过滤分支。

答案 11 :(得分:0)

我想补充@bdonlan的已接受答案。


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

git rm --cached filename

答案应该做什么?

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

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

它从已跟踪??未跟踪状态移动文件,我的意思是,它删除文件并添加 em> 他们又来了。

所以,git 不再知道它们了。


会出什么问题?

在远程,有??这样的东西作为一个??????????????,有????????????????而且在破坏的结果。


为什么?

当与团队合作,如果你????这种变化达到远程它将删除远程谁需要一个????从????????????????????????????????????????????????????????????????????????这些变化,所有的团队。

摘要:您删除从筹备的文件,然后将他们推会导致删除文件的协作团队的本地存储库(??????????????????????????????????????????????????,?????? ????? ?? 将是????。)