我想把一个Git项目放在GitHub上,但它包含某些具有敏感数据的文件(用户名和密码,如/config/deploy。卡皮斯特拉诺的Rb)。
我知道我可以将这些文件名添加到.gitignore中,但这不会删除它们在Git中的历史记录。
我也不想通过删除/来重新开始。git目录。
是否有一种方法可以删除Git历史记录中特定文件的所有痕迹?
我想把一个Git项目放在GitHub上,但它包含某些具有敏感数据的文件(用户名和密码,如/config/deploy。卡皮斯特拉诺的Rb)。
我知道我可以将这些文件名添加到.gitignore中,但这不会删除它们在Git中的历史记录。
我也不想通过删除/来重新开始。git目录。
是否有一种方法可以删除Git历史记录中特定文件的所有痕迹?
当前回答
到目前为止,我已经做过几次了。注意,这一次只对一个文件有效。
获取修改文件的所有提交的列表。底部的将是第一个提交: git log——pretty=oneline——branches——pathToFile 要从历史记录中删除文件,请使用第一个提交sha1和之前命令中的文件路径,并将它们填充到这个命令中: Git filter-branch——index-filter ' Git rm——cached——ignore-unmatch <path-to-file>'——<sha1-where-the-file-was-first-added>..
其他回答
更改密码是一个好主意,但对于从回购历史记录中删除密码的过程,我推荐BFG回购- cleaner,这是一个更快、更简单的替代Git -filter-branch,专门用于从Git回购中删除私人数据。
创建一个private.txt文件,列出你想要删除的密码等(每行一个条目),然后运行以下命令:
$ java -jar bfg.jar --replace-text private.txt my-repo.git
你的回购历史记录中所有小于阈值大小(默认为1MB)的文件将被扫描,任何匹配的字符串(不是你最近提交的)将被替换为字符串“***REMOVED***”。然后你可以使用git gc清除死数据:
$ git gc --prune=now --aggressive
BFG通常比运行git-filter-branch快10-50倍,并且选项是围绕以下两个常见用例进行简化和定制的:
删除疯狂的大文件 删除密码,凭证和其他私人数据
完全披露:我是好心眼巨人回收清理器的作者。
到目前为止,我已经做过几次了。注意,这一次只对一个文件有效。
获取修改文件的所有提交的列表。底部的将是第一个提交: git log——pretty=oneline——branches——pathToFile 要从历史记录中删除文件,请使用第一个提交sha1和之前命令中的文件路径,并将它们填充到这个命令中: Git filter-branch——index-filter ' Git rm——cached——ignore-unmatch <path-to-file>'——<sha1-where-the-file-was-first-added>..
在我的android项目中,我有admob_keys.xml作为分开的xml文件在app/src/main/res/values/文件夹。要删除这个敏感的文件,我使用下面的脚本和工作完美。
git filter-branch --force --index-filter \
'git rm --cached --ignore-unmatch app/src/main/res/values/admob_keys.xml' \
--prune-empty --tag-name-filter cat -- --all
它看起来是这样的:
git rm --cached /config/deploy.rb
echo /config/deploy.rb >> .gitignore
从git中删除跟踪文件的缓存,并将该文件添加到.gitignore列表中
使用filter-branch:
git filter-branch --force --index-filter 'git rm --cached --ignore-unmatch *file_path_relative_to_git_repo*' --prune-empty --tag-name-filter cat -- --all
git push origin *branch_name* -f