选件--replace-text的文档位于:https://github.com/newren/git-filter-repo/blob/7b3e714b94a6e5b9f478cb981c7f560ef3f36506/Documentation/git-filter-repo.txt#L155 --replace-text<expressions_file>:: 包含表达式的文件,如果找到这些表达式,将替换它们。默认情况下,每个表达式都被视为文本,但支持regex:和glob:前缀。您可以使用==>和一些替换文本结束该行,以选择除默认***REMOVED***之外的替换选项。 如何在单个文件中替换:git-filter-repo replace text by expression in a single file 当然,一旦你公开推送了一个密码,就为时已晚,你将不得不更改密码,所以在这种情况下,我甚至不会费心更换:从Git历史中删除敏感文件及其提交 标签:How to substitute text from files in git history? 在git-filter-repo ac 039 ecc 095 d上测试。
#!/bin/bash
#arguments are strings to censore
for string in "$@"
do
echo ""
echo "================ Censoring string "$string": ================"
~/replaceStringInWholeGitHistory.sh "$string" "********"
done
3条答案
按热度按时间sqyvllje1#
git filter-repo --replace-text
Git 2.25
man git-filter-branch
已经明确推荐使用git filter-repo
而不是git filter-tree
,所以我们开始吧。安装https://superuser.com/questions/1563034/how-do-you-install-git-filter-repo/1589985#1589985
然后用途:
或者与Bash魔法相当:
使用以下简单的测试存储库进行测试:https://github.com/cirosantilli/test-git-filter-repository和替换字符串:
上面的行为在默认情况下对所有分支(如此侵入!!!),要仅对选定的分支执行操作,请使用用途:git filter-repo: can it be used on a specific branch?例如:
并且只对指定的提交范围执行操作,您可以:如何使用git filter-repo只修改一个提交范围,而不是整个分支历史?
选件
--replace-text
的文档位于:https://github.com/newren/git-filter-repo/blob/7b3e714b94a6e5b9f478cb981c7f560ef3f36506/Documentation/git-filter-repo.txt#L155--replace-text<expressions_file>::
包含表达式的文件,如果找到这些表达式,将替换它们。默认情况下,每个表达式都被视为文本,但支持
regex:
和glob:
前缀。您可以使用==>
和一些替换文本结束该行,以选择除默认***REMOVED***
之外的替换选项。如何在单个文件中替换:git-filter-repo replace text by expression in a single file
当然,一旦你公开推送了一个密码,就为时已晚,你将不得不更改密码,所以在这种情况下,我甚至不会费心更换:从Git历史中删除敏感文件及其提交
标签:How to substitute text from files in git history?
在git-filter-repo ac 039 ecc 095 d上测试。
ffx8fchx2#
首先,找到所有可能包含密码的文件。假设密码是
abc123
,分支是master
。您可能需要排除那些仅将abc123
作为普通字符串的文件。然后将“abc123”替换为“******”。假设其中一个文件是
foo/bar.txt
。最后,强制将
master
推送到远程存储库(如果存在)。我做了一个简单的测试,它的工作,但我不知道如果它的好你的情况。您需要处理所有分支的所有文件。至于标签,您可能必须删除所有旧的,并创建新的。
pxq42qpu3#
首先,我要感谢ElpieKay,他发布了我的解决方案的核心功能,我只是将其自动化。
最后,我终于有了我想要的剧本。我把它分成几个部分,它们相互依赖,可以作为独立的脚本。它看起来像这样:
www.example.com censorStringsInWholeGitHistory.sh:
用法:
www.example.com replaceStringInWholeGitHistory.sh:
用法:
www.example.com replaceStringInBranch.sh:
用法:
www.example.com findFilesContainingStringInBranch.sh:
用法:
www.example.com changeStringsInFileInCurrentBranch.sh:
用法:
我有所有这些脚本位于我的主文件夹中,什么是必要的,在这个版本中正常工作。我不确定这是最好的选择,但现在我找不到更好的。当然,每个脚本都必须是可执行的,我们可以用
chmod +x ~/myscript.sh
来实现。可能我的脚本不是最佳的,对于大型repo它将处理很长时间,但它工作:)
而且,在最后,我们可以将我们的审查存储库推送到任何远程:
不要忘记删除和重新创建您推送的标签。他们仍然指向可能包含您的密码的旧提交。
也许我会在将来改进我的脚本来自动完成这一点。