使用树过滤器和macOS上的sed从Git提交中删除敏感数据
我试着阅读了多篇关于使用树过滤器和macOS上的sed从Git提交中删除敏感数据,git,macos,sed,zsh,Git,Macos,Sed,Zsh,我试着阅读了多篇关于sed以及如何从已提交的文件中删除密钥的文章。我在试这个 git filter-branch --tree-filter \ "sed -i '' 's/my_sensitive_data/<your-api-key>/' ./app/src/main/java/com/demo/Test.kt" git过滤器分支--树过滤器\ “sed-i''s/my_sensitive_data/'./app/src/main/java/com/demo
sed
以及如何从已提交的文件中删除密钥的文章。我在试这个
git filter-branch --tree-filter \
"sed -i '' 's/my_sensitive_data/<your-api-key>/' ./app/src/main/java/com/demo/Test.kt"
git过滤器分支--树过滤器\
“sed-i''s/my_sensitive_data/'./app/src/main/java/com/demo/Test.kt”
我一直得到sed./app/src/main/java/com/demo/Test.kt:没有这样的文件或目录
。但如果我接受同样的命令
sed-i''s/my_sensitive_data/'./app/src/main/java/com/demo/Test.kt
在我运行中的git filter分支
命令的目录中,sed
命令会适当地替换它
我正在运行macOS catalina并使用ZSH。这里我可能做错了什么?使用
git筛选器分支
,git在每次提交时都会运行筛选器。1即树筛选器:
- 签出提交(在临时目录中)李>
- 运行指定的命令(在该临时目录中);及
- 根据该命令留下的内容生成替换提交
sed
命令失败。git-filter-branch
将失败视为筛选命令的非零退出状态,导致git-filter-branch
本身停止,而不执行所需的筛选
解决方案是避免在文件不存在时完全运行此sed
命令。有两种方法可以做到这一点(请参见脚注1),但最简单的方法是修改命令以首先检查。而不是:
sed -i '' 's/my_sensitive_data/<your-api-key>/' ./app/src/main/java/com/demo/Test.kt
将实现这一技巧,因为这将复制和筛选限制为(a)具有文件且(b)需要编辑的提交。git filter分支的手册页对
--tree filter
参数这样说:“(…)在shell中对参数进行求值,并将工作目录设置为签出树的根目录。”这符合你的期望吗?我不知道你的目录结构是什么样子的,因此很难从这里判断这是否是问题所在。@prosoitos是的,它在.git
所在的根目录中运行。但它是一个旧的提交吗?因为如果它是最近的修订版,但没有人看到它,您可以修改该修订版。@eftshift0是的,它实际上不是问题。我只是想看看它在实践中是如何工作的。每个提交都有这个文件吗?
if [ -f app/src/main/java/com/demo/Test.kt ]; then
sed -i '' 's/my_sensitive_data/<your-api-key>/' app/src/main/java/com/demo/Test.kt
fi
git filter-branch <filter-specifiers> -- cafedad..master