Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用树过滤器和macOS上的sed从Git提交中删除敏感数据_Git_Macos_Sed_Zsh - Fatal编程技术网

使用树过滤器和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即树筛选器:

  • 签出提交(在临时目录中)
  • 运行指定的命令(在该临时目录中);及
  • 根据该命令留下的内容生成替换提交
对于要复制的每个提交,filter branch命令都会重复此操作。(过滤器分支就是这样做的:它复制提交。原始文件继续存在。)

您的一些提交有该文件;sed命令将对这些提交起作用。您的一些提交缺少该文件,在这种情况下,
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