使用 git filter-branch 时,它会复制我的提交历史并创建重复文件。我该如何摆脱这个?

When using git filter-branch, it duplicates my commit history and creates duplicate files. How do I get rid of this?

我不小心在我的一个文件中输入了密码,所以现在我正试图摆脱它。

我运行的命令是:

git filter-branch --tree-filter "find . -type f -exec sed -i -e 's/password/REDACTED/g' {} \;"

它成功地完成了我需要它做的事情,但它复制了我的所有扩展名为 .rb-e 的文件,并且还复制了我所有的提交。如何摆脱这些文件,并防止我的提交重复?

MacOS X 附带的 sed 是 BSD sed,不是 GNU sed,并且 它不能在不进行备份的情况下更改文件 - 它的 -i 标志总是带有一个参数,即备份文件将具有的后缀。在您的调用中,-i -e 被解析为一个标志,告诉 sed 就地编辑文件并在 filename-e 中备份。这就是您获得大量 .rb-e 个文件的原因。

我认为最实用的解决方案是事后删除备份文件。也就是说,

git filter-branch --tree-filter "find . -type f -exec sed -i.bak 's/password/REDACTED/g' {} \; -exec rm '{}'.bak \;"

我冒昧地将 -e 替换为更合理的文件扩展名 (.bak)。 确保使用的后缀不会与您要保留的文件发生冲突。 如果您愿意,可以将 -e 放回原处,但在此没有必要案例.

编辑:@torek 指出,如果 BSD sed 的 -i 标志被赋予一个空字符串作为参数(即 ''),则它可以就地编辑文件;主要使用 GNU sed,我不知道。不过,我觉得允许 sed 生成备份文件比使用 -i '' 更好。在上面的 find 调用中,第二个 -exec 中的命令只有在第一个命令报告成功完成时才会执行(因为 -exec 也是一个过滤器),所以有了它,如果 sed 返回错误,您仍然会有备份文件。当事情变得非常糟糕时,最好有备份。

这实际上是一个 sed 问题,而不是 git 问题:

-i extension

Edit files in-place, saving backups with the specified extension. If a zero-length extension is given, no backup will be saved. It is not recommended to give a zero-length extension when in-place editing files, as you risk corruption or partial content in situations where disk space is exhausted, etc.

你给出了 extension 参数 -e,然后是没有 -e 标志的 sed 命令(只要有只有一个命令)。

如果您使用 sed -i '' 这将提供零长度扩展,但请参阅上面的“不推荐”部分。