在 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,然后是 add
和 commit
【讨论】:
以上是关于在 Github repo 上的所有先前提交中隐藏密码的主要内容,如果未能解决你的问题,请参考以下文章