如何从Github中删除用户敏感数据

如何从Github中删除用户敏感数据,git,github,version-control,Git,Github,Version Control,我撰写Github文章是为了从Github回购中删除一些敏感数据,但我不知道如何将我在本地所做的所有更改“强制推送”到Github,让我更好地解释一下: 我创建了一个测试报告并提交了一些,一个名为false\u sensitive\u data.txt的文件,它位于项目的根目录中 我开始进行回购 我从回购协议中创建了一个敏感数据 我将项目克隆到另一个文件夹中 在新克隆的文件夹中,我使用命令bfg--delete files-fake\u-sensitive\u-data.txt从git历史记录中

我撰写Github文章是为了从Github回购中删除一些敏感数据,但我不知道如何将我在本地所做的所有更改“强制推送”到Github,让我更好地解释一下:

  • 我创建了一个测试报告并提交了一些,一个名为
    false\u sensitive\u data.txt
    的文件,它位于项目的根目录中
  • 我开始进行回购
  • 我从回购协议中创建了一个敏感数据
  • 我将项目克隆到另一个文件夹中
  • 在新克隆的文件夹中,我使用命令
    bfg--delete files-fake\u-sensitive\u-data.txt从git历史记录中删除了
    fake\u-sensitive\u-data.txt
  • 清理完成后,我使用命令强制将内容推送到Github:
    git push origin--force--all&&git push origin--force--tags
  • 因此,为了从我的回购协议中删除文件
    false\u sensitive\u data.txt
    ,我采取了以下步骤,现在我面临的问题是:

  • 文件仍保留在分支中
  • 该文件仍保留在已删除和删除的分支中
  • 该文件仍保留在已合并为主文件的文件中
  • 所以我的问题是,如何从所有分支、提交、PRs、标记(任何内容)中删除文件和历史记录,并将其推送到Github?

    TL;博士 你必须让GitHub做你需要的事情。即使如此,如果提交已被复制到其他存储库中,那么您也必须让所有其他副本(以及拥有它们的人)更新它们的副本

    长的 没有任何力量可以从包含该文件的提交中删除该文件。任何东西都无法更改任何现有的提交。一旦做出了承诺,它实际上就被固定在石头上,或者永远冻结

    BFG和
    git过滤器分支
    所做的是通过将包含该文件的提交复制到不包含该文件的新提交来进行新的和改进的提交。(在本例中,新提交没有该文件这一事实就是改进之处。)

    到目前为止,这相当简单。旧的承诺仍然存在,现在新的承诺也存在。但是你想让旧的消失。这就是一切都出错的地方。这也是事情变得有点复杂的地方

    此时您应该问的问题是:

    • Git首先是如何找到提交的
    • 就这一点而言,人们如何找到一个承诺?提交的真实名称是什么
    上面有四个链接,其中一个是。我将留下完整的URL显示在这里。请注意末尾有一个非常长的随机十六进制数字字符串,
    124e5707bf29a24cfb4167c869250fd919c42446
    。这是提交的哈希ID。它

    这是提交的真实名称。这就是拥有提交的人每次都能可靠地找到它的方式。您只需记住
    124eblahblah
    (硬)或将其写在某个地方,然后剪切粘贴(简单)并运行
    git checkout hash id
    ,就可以使用它了

    现在,每一个存储库,包括某个原始存储库的每个克隆,都有它接收到的每一个提交,减去它抛出的任何提交。请注意,BFG在结束其会话时建议运行:

    git gc
    命令是git的死神垃圾收集器。它是内务管理程序,或者更准确地说,是单个内务管理程序的主管,负责寻找提交和其他无人能找到的Git对象。如果你找不到这个对象,如果它的散列ID没有写在Git可以看到的任何地方,那么,你显然不在乎Grim收集器是否完全删除了它

    所以现在我们要问:

    • 在哪里可以写下这些散列ID以便Git可以看到它们
    对于Git本身,答案主要是:在其他提交中。每个提交都可以列出一些其他提交的哈希ID。如果使用散列H的提交列出了提交散列ID G,那么任何能够找到H的人都可以使用它来找到G。如果散列ID为G的提交列出了提交F的散列ID,那么任何具有H或G的人都可以找到F

    如果你想画它,画一个有一些箭头的提交。这些是提交中的父提交哈希ID。大多数提交只有一个。合并提交的两个父级有两个。1这些箭头始终向后指向以前的某个提交。因此,如果你能找到最后一次提交,你就能找到每一次提交

    这就是分支名称(
    master
    )、标记名称(
    v1.2
    )和远程跟踪名称(
    origin/master
    )的来源。Git提供这些命名设备来查找一个特定的提交。2使用分支名称,这是我们应该说是分支的最后一个提交。对于任何其他名称,这只是一些散列ID,例如,标记可以将特定提交标记为“使用此提交访问版本1.2”

    这些名称统称为引用或引用。当BFG说:

    更新参考文献6

    这就是它所说的。BFG将一些特定的原始承诺复制到新的和改进的承诺。然后,在复制了这些文件之后,它还必须复制所有后续提交,要么对它们进行改进(因为它们有您想要的文件),要么仅仅因为旧的提交保存了其他一些旧的、错误的提交的哈希ID,而这些提交现在已经得到了改进

    一旦BFG复制并改进了所有需要改进的内容,并且复制了由于复制和改进而必须复制的所有其他内容,BFG就会进入并适当地更改每个参考

    但是BFG只能更改存储库中的引用。存在的每个Git存储库都有自己的引用。所有Git共享提交(通过复制),但它们不一定共享所有引用

    在更新了您自己的存储库的refs之后,BFG现在建议您清除Git的reflogs
    
    Using repo : git-test-removing-sensitive-data-clean/.git
    
    Found 7 objects to protect
    Found 3 tag-pointing refs : refs/tags/v1, refs/tags/v2, refs/tags/v3
    Found 5 commit-pointing refs : HEAD, refs/heads/master, refs/remotes/origin/HEAD, ...
    
    Protected commits
    -----------------
    
    These are your protected commits, and so their contents will NOT be altered:
    
    * commit b8c88b09 (protected by 'HEAD')
    
    Cleaning
    --------
    
    Found 11 commits
    Cleaning commits:       100% (11/11)
    Cleaning commits completed in 73 ms.
    
    Updating 6 Refs
    ---------------
    
           Ref                                       Before     After   
           -------------------------------------------------------------
           refs/heads/master                       | b8c88b09 | 82104232
           refs/remotes/origin/lev/pr-to-stay-open | 2b131b17 | 0bcfb420
           refs/remotes/origin/master              | b8c88b09 | 82104232
           refs/tags/v1                            | c740754e | b8a33de1
           refs/tags/v2                            | 4abc08c8 | a0fdb11d
           refs/tags/v3                            | a448a05e | 4c4176a7
    
    Updating references:    100% (6/6)
    ...Ref update completed in 18 ms.
    
    Commit Tree-Dirt History
    ------------------------
    
           Earliest      Latest
           |                  |
           . D D D DD D D D m m
    
           D = dirty commits (file tree fixed)
           m = modified commits (commit message or parents changed)
           . = clean commits (no changes to file tree)
    
                                   Before     After   
           -------------------------------------------
           First modified commit | 0cd750f6 | dedd68e8
           Last dirty commit     | 2b131b17 | 0bcfb420
    
    Deleted files
    -------------
    
           Filename                  Git id          
           ------------------------------------------
           fake_sensitive_data.txt | cc86c97f (199 B)
    
    
    In total, 18 object ids were changed. Full details are logged here:
    
           git-test-removing-sensitive-data-clean.bfg-report/2020-01-24/09-22-19
    
    BFG run is complete! When ready, run: git reflog expire --expire=now --all && git gc --prune=now --aggressive
    
    git reflog expire --expire=now --all && git gc --prune=now --aggressive