开发.NET项目后的一些提交,我意识到我不想跟踪bin
,obj
或packages
个文件夹的任何内容,我也不想跟踪*.suo
或*.user
格式的任何文件。所以我创建了一个名为.gitignore
的文本文件,其中包含那些行,我将文件保存在我的存储库的根目录中。现在我要做的是追溯删除历史记录中的那些,或者如果我不能这样做,至少让它们脱离我的下一次提交。我试过跑
git rm -r --cached bin/
按照Ignoring a directory from a Git repo after it's been added的建议,我得到了
致命:pathspec
bin/
与任何文件都不匹配
我该如何解决这个问题,或者是否有一个更容易的命令会追溯删除所有这些内容?
答案 0 :(得分:0)
如果需要,您可以追溯删除文件,但有一些警告。对于只有你访问的小型回购,这没什么大不了的; repo越大(主要是提交次数)或者使用它的人越多,潜在的麻烦就越大。
基本程序看起来像这样:
1)拥有repo副本的每个人都应该提交并推送他们想要保留的任何更改。这些不必合并,但应将它们推到原点。 (任何非原产地的变化都必须在事后进行迁移 - 这个过程既简单又不简单 - 或者只是重做。)然后每个人都应该暂停开发并丢弃它们当地的回购克隆。
2)执行历史记录重写。对于小型仓库,可以使用git filter-branch
之类的索引过滤器使用git rm --cached --ignore-unmatch -- <pathspecs>
来完成此操作。更快的选择,特别是对于大型回购,将是BFG回购清洁剂。
(这两个选项都有很好的使用文档,所以我不会直接详细介绍它们。但如果你有特定的后续问题,请随时问。)
您使用的任何工具都会在您的仓库中“重写历史记录”。这意味着现有的提交 - 可能所有提交都基于您的用例 - 将被新的提交替换。 (通过“新提交”我的意思是提交将具有新的SHA1标识符,并且git将不会将它们识别为与旧提交相关。)这就是为什么每个人都不得不抛弃他们的旧克隆。
3)发布重写的来源(通过您之前发布原文的任何方式)。
现在每个人都可以克隆重写的回购,工作可以恢复。
老实说,这是一个相当激烈的步骤。如果有人意外提交包含密码或其他敏感信息的文件,那么很高兴知道你可以这样做。或者,如果您可以通过删除不需要的内容(例如依赖项的副本)来实际节省回购中的大量空间。为此......我认为这不值得。
要从后续提交中删除文件(以便.gitignore可以生效),您正在使用的命令应该可以正常工作,假设您位于包含bin/
目录的目录中。