在 Github repo 上的所有先前提交中隐藏密码

Posted

技术标签:

【中文标题】在 Github repo 上的所有先前提交中隐藏密码【英文标题】:Hide password in all previous commits on Github repo 【发布时间】:2018-07-28 07:44:00 【问题描述】:

我已将我的项目上传到 GitHub 公共仓库。但是其中一个文件包含我的密码信息。我已经做出了一些承诺。如何在初始提交时隐藏我的密码?

没有单独的密码文件。所以在这种情况下我不能使用 .gitignore 。密码被硬编码在处理应用程序主要逻辑的 app.py 文件中。所以,我不能使用 BFG Repo-Cleaner。是否可以通过覆盖先前的提交来删除文件并添加新文件?

我已经在文件中进行了更改并推送到了一个 repo。但是,以前的提交仍然显示了我的密码信息。另外,我对创建新的 repo 并删除旧的 repo 不感兴趣(除非我别无选择)。

如果我能得到一些帮助,我会很高兴。

提前致谢。

【问题讨论】:

Completely remove file from all Git repository commit history 的可能重复项 - 这个答案 ***.com/a/23188613/7505395 涵盖了它。 在您执行任何其他操作之前,请更改您的密码。你上传的那个永远被泄露了。 @Chris 是的,我已更改密码。谢谢 @PatrickArtner 非常感谢您的回复。但问题是我在处理我的应用程序主要逻辑的文件中硬编码了密码。所以我不能删除那个文件。 @AkshayC,所以不要硬编码它。有很多方法可以从非源代码控制文件中提取配置,例如使用environment variables。 【参考方案1】:

GitHub 有一篇文章正好说明了这一点。看看here。总结这篇文章:您可以使用git filter-branch 命令或 BFG Repo-Cleaner。 BFG Repo-Cleaner 使用起来更容易、更快捷,所以我使用它。要使用 BFG Repo-Cleaner,请按以下步骤操作:

    Download 项目仓库中的 jar 文件或与 macos 一起使用 brew install bfg 使用 --mirror 标志克隆您的 repo 的新副本:

git clone --mirror git://example.com/some-big-repo.git

如果使用 SSH 或

git clone --mirror https://example.com/some-big-repo.git

如果使用 HTTPS。

这是一个裸存储库,因此您将无法看到您的文件,但它将是包含所有提交的存储库的完整副本。

    然后您可以使用以下命令从以前的提交中删除特定文件:

java -jar bfg.jar --delete-files [FILE NAME] --no-blob-protection my-repo.git

或者如果安装到 PATH

bfg --delete-files [FILE NAME] --no-blob-protection my-repo.git

或从旧提交中删除密码

bfg --replace-text passwords.txt

    在推送回您的存储库之前,请进入您的 git 存储库文件夹并运行以下命令,检查存储库历史记录是否已更改:

git reflog expire --expire=now --all && git gc --prune=now --aggressive

然后

git gc

删除您不想推送回您的存储库的不需要的数据。

    一旦你满意,通过运行git push 推回你的远程仓库 - 请注意,因为你在克隆你的仓库时使用了--mirror 标志,当你推回你的仓库时,你也会推回参考变化。

要了解有关 BFG Repo-Cleaner 的更多信息,请访问link。

【讨论】:

这是一条评论(很好,没关系)。答案永远不应该是仅链接的。请参阅why-do-i-need-50-reputation-to-comment-what-can-i-do-instead 即使链接断开,答案也应该是有效的。 感谢您编辑和回复反馈,您的回答更适合本网站,并且适合问答格式。 :) 谢谢你,帕特里克。我感谢你的努力。我必须详细阅读这个。但我需要那个有密码的文件。因为该文件处理我的应用程序的主要逻辑。所以我不能删除那个文件。 嗨,Akshay C。我回答了这个问题,这里有一个回答你的问题的答案的链接。 ***.com/a/2397905 @PritamSangani 非常感谢您提供有关 BFG Repo-Cleaner 的详细信息。但在这种情况下,它对我没有用,因为密码保存在处理应用程序主要逻辑的同一文件中。所以我不能删除这个文件。有没有办法通过覆盖以前的提交来删除文件并上传新文件?【参考方案2】:

这是一种替代且快速的解决方法,可以在不删除文件的情况下更改敏感数据。

# Sync with the remote master
git pull

# Force your clone to look like HEAD
git reset --hard

# AGAIN, A WARNING: This can really break stuff!

# Run your filter branch command, replacing all instances of "password" with "your_password"
# The example looks for Ruby files ("*.rb"), you can change this to match your needs
git filter-branch --tree-filter 'git ls-files -z "*.rb" |xargs -0 perl -p -i -e "s#(password)#your_password#g"' -- --all

# Overwrite your master with local changes
git push origin master --force

来源:https://palexander.posthaven.com/remove-a-password-from-gits-commit-history-wi

【讨论】:

【参考方案3】:

先复制文件(即app.py

从 git 历史记录中删除文件(将 PATH-TO-YOUR-FILE-WITH-SENSITIVE-DATA 替换为 path/to/app.py)(如果您从远程存储库克隆,还需要推送存储库):

git filter-branch --force --index-filter \
  "git rm --cached --ignore-unmatch PATH-TO-YOUR-FILE-WITH-SENSITIVE-DATA" \
  --prune-empty --tag-name-filter cat -- --all
git push --force --verbose --dry-run
git push --force

现在从 app.py 文件中删除密码并将其移动到 git repo,然后是 addcommit

【讨论】:

以上是关于在 Github repo 上的所有先前提交中隐藏密码的主要内容,如果未能解决你的问题,请参考以下文章

将子模块更新为最新的提交

如何撤消 Github 中的先前提交 [重复]

在这种情况下,repo 中可能不存在合并 PR 的提交?

如何将代码提交到 Github 上的子文件夹

在 Heroku 上清理 git repo

Github API - 检索用户提交?