我在我的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日志,这导致存储库中每次提交的重复提交,作者日期和注释相同,预期的哈希是新的。这是我应该期待的吗?我认为它将用不同版本的文件替换现有的提交。
有没有更好的方法来进行不会导致所有无关提交的转换?
答案 0 :(得分:2)
Git提交是不可变的,所以每当你想要改变关于给定提交的任何时,你实际上必须创建一个新的提交。这包括文件内容,作者日期/时间或父提交。 (因此,如果您在一次提交中更改内容,则必须为所有后续提交创建新提交。)
所以是的,这是你应该期待的,不,没有办法进行不产生新提交的转换。对于任何重写历史记录的命令都是如此,其中包括rebase
以及filter-branch
。
在Pro Git书的Git Internals - Git Objects部分中详细了解其工作原理。