使用 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 ''
这将提供零长度扩展,但请参阅上面的“不推荐”部分。
我不小心在我的一个文件中输入了密码,所以现在我正试图摆脱它。
我运行的命令是:
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 ''
这将提供零长度扩展,但请参阅上面的“不推荐”部分。