我试图追溯忽略这些文件和文件夹时遗漏了什么?

时间:2017-03-22 14:51:57

标签: .net git gitignore git-bash

开发.NET项目后的一些提交,我意识到我不想跟踪binobjpackages个文件夹的任何内容,我也不想跟踪*.suo*.user格式的任何文件。所以我创建了一个名为.gitignore的文本文件,其中包含那些行,我将文件保存在我的存储库的根目录中。现在我要做的是追溯删除历史记录中的那些,或者如果我不能这样做,至少让它们脱离我的下一次提交。我试过跑

git rm -r --cached bin/

按照Ignoring a directory from a Git repo after it's been added的建议,我得到了

  

致命:pathspec bin/与任何文件都不匹配

我该如何解决这个问题,或者是否有一个更容易的命令会追溯删除所有这些内容?

1 个答案:

答案 0 :(得分:0)

如果需要,您可以追溯删除文件,但有一些警告。对于只有你访问的小型回购,这没什么大不了的; repo越大(主要是提交次数)或者使用它的人越多,潜在的麻烦就越大。

基本程序看起来像这样:

1)拥有repo副本的每个人都应该提交并推送他们想要保留的任何更改。这些不必合并,但应将它们推到原点。 (任何非原产地的变化都必须在事后进行迁移 - 这个过程既简单又不简单 - 或者只是重做。)然后每个人都应该暂停开发并丢弃它们当地的回购克隆。

2)执行历史记录重写。对于小型仓库,可以使用git filter-branch之类的索引过滤器使用git rm --cached --ignore-unmatch -- <pathspecs>来完成此操作。更快的选择,特别是对于大型回购,将是BFG回购清洁剂。

(这两个选项都有很好的使用文档,所以我不会直接详细介绍它们。但如果你有特定的后续问题,请随时问。)

您使用的任何工具都会在您的仓库中“重写历史记录”。这意味着现有的提交 - 可能所有提交都基于您的用例 - 将被新的提交替换。 (通过“新提交”我的意思是提交将具有新的SHA1标识符,并且git将不会将它们识别为与旧提交相关。)这就是为什么每个人都不得不抛弃他们的旧克隆。

3)发布重写的来源(通过您之前发布原文的任何方式)。

现在每个人都可以克隆重写的回购,工作可以恢复。

老实说,这是一个相当激烈的步骤。如果有人意外提交包含密码或其他敏感信息的文件,那么很高兴知道你可以这样做。或者,如果您可以通过删除不需要的内容(例如依赖项的副本)来实际节省回购中的大量空间。为此......我认为这不值得。

要从后续提交中删除文件(以便.gitignore可以生效),您正在使用的命令应该可以正常工作,假设您位于包含bin/目录的目录中。