发布于 2026-01-06 8 阅读
0

不小心删除了提交到 GitHub 的密码 DEV 的全球展示挑战赛,由 Mux 呈现:展示你的项目!

不小心删除了提交到 GitHub 的密码

由 Mux 主办的 DEV 全球展示挑战赛:展示你的项目!

额外福利——你也可以在我的Twitch 直播间观看我谈论这件事。

不小心删除了提交到 GitHub 的密码

日复一日地编写代码,难免会无意间将密钥、连接字符串等信息添加到代码中。如果你和我一样,它们很可能被提交到你的 GitHub 代码库,然后你就只能默默承受这份尴尬了。:) 在这篇文章中,我将一步步指导你如何从已经提交过密钥的 GitHub 代码库中删除它们。

第一部分 - 初始设置:

场景:您已将一个值为 `<password>` 的密码提交qph@}uC,7cGLBdsX到您的 GitHub 代码库。此密码应保密,不应存储在代码中。

如何解决这个问题?

  • 请确保仓库已安装在本地磁盘上,或者使用 HTTPS 或 SSH 克隆一份全新的副本。我将以 SSHgit clone git@github.com:mbcrump/crumpbot.git为例进行说明。
  • 使用镜像选项克隆一个存储了密钥的仓库副本,如下所示git clone --mirror git@github.com:mbcrump/crumpbot.git
  • 现在您将拥有一个 BARE 仓库。使用 `cd` 命令进入该仓库cd crumpbot.git,然后ls -l在 macOS 或 Windows 系统上运行 `ls` 命令列出其内容dir

以下是我的代码仓库示例。

[mbcrump@Michaels-MBP-3]:[~/Documents/code]$ cd crumpbot.git
[mbcrump@Michaels-MBP-3]:[~/Documents/code/crumpbot.git] (BARE:master)$ ls -l
total 32
-rw-r--r--   1 mbcrump  staff   23 Dec  1 19:47 HEAD
-rw-r--r--   1 mbcrump  staff  211 Dec  1 19:47 config
-rw-r--r--   1 mbcrump  staff   73 Dec  1 19:47 description
drwxr-xr-x  13 mbcrump  staff  416 Dec  1 19:47 hooks
drwxr-xr-x   3 mbcrump  staff   96 Dec  1 19:47 info
drwxr-xr-x  27 mbcrump  staff  864 Dec  1 19:48 objects
-rw-r--r--   1 mbcrump  staff  105 Dec  1 19:47 packed-refs
drwxr-xr-x   4 mbcrump  staff  128 Dec  1 19:47 refs
Enter fullscreen mode Exit fullscreen mode

第二部分 - 创建一个包含您想要删除的密码的文件:

  • 创建一个passwords.txt文件,并将要从 GitHub 仓库中删除的密码放入其中。

我在 macOStouch passwords.txtecho some-text > passwords.txtWindows 上创建了我的账户,并添加了我不小心输错的密码:

qph@}uC,7cGLBdsX
Enter fullscreen mode Exit fullscreen mode
  • 保存文件。

第三部分 - 安装 BFG:

进入BFG的世界。作者如是说:

BFG 是 git-filter-branch 的一个更简单、更快捷的替代方案,用于清理 Git 仓库历史记录中的不良数据:
删除超大文件、
删除密码、凭据和其他私有数据

第四部分 - 清理之前提交的密码:

  • bfg --replace-text passwords.txt crumpbot.git在 Mac 上运行,或者java -jar bfg.jar --replace-text passwords.txt crumpbot.git使用 JAR 文件。

  • 以下是该命令的输出结果:

[mbcrump@Michaels-MBP-3]:[~/Documents/code]$ bfg --replace-text passwords.txt crumpbot.git

Using repo : /Users/mbcrump/Documents/code/crumpbot.git

Found 2489 objects to protect
Found 2 commit-pointing refs : HEAD, refs/heads/master

Protected commits
-----------------

These are your protected commits, and so their contents will NOT be altered:

 * commit 58969937 (protected by 'HEAD')

Cleaning
--------

Found 11 commits
Cleaning commits:       100% (11/11)
Cleaning commits completed in 96 ms.

Updating 1 Ref
--------------

        Ref                 Before     After   
        ---------------------------------------
        refs/heads/master | 58969937 | 3f9041c9

Updating references:    100% (1/1)
...Ref update completed in 24 ms.

Commit Tree-Dirt History
------------------------

        Earliest      Latest
        |                  |
        D D D D DD D D m 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 | 39e68d03 | 95e6f9f4
        Last dirty commit     | 2007b5c5 | 0f57a693

Changed files
-------------

        Filename   Before & After                               
        --------------------------------------------------------
        bot.js   | 1b55a8d0 ⇒ 02758dd8, cba19782 ⇒ db95f8c2, ...


In total, 19 object ids were changed. Full details are logged here:

        /Users/mbcrump/Documents/code/crumpbot.git.bfg-report/2019-12-01/19-48-22

BFG run is complete! When ready, run: git reflog expire --expire=now --all && git gc --prune=now --aggressive
Enter fullscreen mode Exit fullscreen mode

第五部分 - 推送到 GitHub:

  • git reflog expire --expire=now --all && git gc --prune=now --aggressive按照输出指示运行。
  • 运行命令git push将其推送到您的仓库。

第六部分 - 总结并验证您的仓库是否已成功更新:

如果你回到你的 GitHub 仓库并查看之前的提交记录,你应该会看到类似这样的*已移除*:

var tmi = require("tmi.js")
var channel = "mbcrump"

var config = {
    options: {
        debug: true
    }, 
    connection: {
        cluster: "aws", 
        reconnect: true
    },
    identity: {
        username: "mbcrump",
        password: "***REMOVED***"
    },
    channels: [channel]
}
Enter fullscreen mode Exit fullscreen mode

正如https://twitter.com/grierson_david指出的那样

此类提交应始终视为密码泄露。

无法保证泄露的密码没有被复制到其他地方,因此应始终将其视为已泄露并予以更改。

希望这对大家有所帮助,如果想保持联系,可以在TwitchTwitterGitHub上找到我。

文章来源:https://dev.to/mbcrump/remove-passwords-comfilled-to-github-on-accident-1oj9