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

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

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

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

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

提前致谢。

【问题讨论】:

  • 在您执行任何其他操作之前,请更改您的密码。你上传的那个永远被泄露了。
  • @Chris 是的,我已更改密码。谢谢
  • @PatrickArtner 非常感谢您的回复。但问题是我在处理我的应用程序主要逻辑的文件中硬编码了密码。所以我不能删除那个文件。
  • @AkshayC,所以不要硬编码它。有很多方法可以从非源代码控制文件中提取配置,例如使用environment variables

标签: git github repository password-protection sensitive-data


【解决方案1】:

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

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

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

如果使用 SSH 或

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

如果使用 HTTPS。

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

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

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

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

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

然后

git gc

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

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

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

【讨论】:

  • 这是一条评论(很好,没关系)。答案永远不应该是仅链接的。请参阅why-do-i-need-50-reputation-to-comment-what-can-i-do-instead 即使链接断开,答案也应该是有效的。
  • 感谢您编辑和回复反馈,您的回答更适合本网站,并且适合问答格式。 :)
  • 谢谢你,帕特里克。我感谢你的努力。我必须详细阅读这个。但我需要那个有密码的文件。因为该文件处理我的应用程序的主要逻辑。所以我不能删除那个文件。
  • 嗨,Akshay C。我回答了这个问题,这里有一个回答你的问题的答案的链接。 stackoverflow.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

    【讨论】:

      猜你喜欢
      • 2020-08-17
      • 2013-10-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-26
      • 1970-01-01
      • 2018-01-21
      相关资源
      最近更新 更多