私のgitリポジトリで次のコマンドを実行して、すべてのテキストファイルを強制的にunix行末を使用しました。gitフィルタを実行した後に重複コミットが発生するのはなぜですか?
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
これによると、リポジトリ内のコミットごとに重複コミットが発生し、作成者の日付とコメントは同じです。期待どおりのハッシュが新しいものです。それは私が期待していたはずのものですか?私はそれが既存のコミットを異なるバージョンのファイルで置き換えると思った。
無関係なすべてのコミットが発生しないような変換を行うより良い方法はありますか?
奇妙なことに、私が実行したフィルタコマンドは、何も必要でない(コミット - >変換が発生していない)コミットを作成しましたか? – MarkE
@ MarkEおそらく、私はこれをテストしていません。 (私は 'git rebase'がどのように動作するのか知っています) –
filter-branchコマンドは、修正されていないコミットを意図的にスキップするという点で、' git rebase'ほどスマートではありません。代わりに、元のコミット*(作成者とコミッターのデータを含む)からの保存されたメタデータを使用して、新しいコミット*を作成します。 * tree *が変更されておらず、* parents *が変更されておらず、残りのデータとメタデータが変更されていない場合、 "コピー"コミットは元のビットと同じビットであるため、同じハッシュしたがって、*同じコミットであり、自然に再利用されます。 (Rebaseは意図的にコミットをコピーするときにコミッターのメタデータを保存しません) – torek