为什么运行git过滤器后会有重复的提交?

时间:2016-10-27 00:09:01

标签: git git-filter-branch

我在我的git存储库上运行了以下命令,强制所有文本文件都使用unix行结尾。

git filter-branch --force --tree-filter 'git ls-files | xargs file | sed -n -e "/.*: .*text.*/s/\(.*\): .*/\1/p" | xargs dos2unix' --tag-name-filter cat -- --all

根据git日志,这导致存储库中每次提交的重复提交,作者日期和注释相同,预期的哈希是新的。这是我应该期待的吗?我认为它将用不同版本的文件替换现有的提交。

有没有更好的方法来进行不会导致所有无关提交的转换?

1 个答案:

答案 0 :(得分:2)

Git提交是不可变的,所以每当你想要改变关于给定提交的任何时,你实际上必须创建一个新的提交。这包括文件内容,作者日期/时间或父提交。 (因此,如果您在一次提交中更改内容,则必须为所有后续提交创建新提交。)

所以是的,这是你应该期待的,不,没有办法进行不产生新提交的转换。对于任何重写历史记录的命令都是如此,其中包括rebase以及filter-branch

在Pro Git书的Git Internals - Git Objects部分中详细了解其工作原理。