4

私のリポジトリには、多数の大きなファイルがあります。それらはほとんどがデータ (テキスト) です。リファクタリングやパッ​​ケージ化のために、これらのファイルを別の場所に移動する必要がある場合があります。

コマンドを使用git mvしてファイルのパスを「名前変更」しますが、コミットのサイズ (実際の差分サイズ) が非常に大きく、rm.git add

コミットサイズを減らす他の方法はありますか? または、それらを追加して.gitignorezipファイルとしてアップストリームにアップロードするだけですか?


回答ありがとうございます。

参考までに、一連のコマンドを実行すると、ファイルのサイズが表示されますbar

git mv foo bar
git commit -m "modify"
git cat-file -s HEAD:bar

そこから私はgitがやったrmと思ったadd. この情報が実際のサイズと関係がないか教えていただけますか?

4

2 に答える 2

8

設計上、コンテンツを変更せずにファイルを Git リポジトリ内に移動すると、コミットを作成すると、新しいファイルの場所を表す新しいメタデータ (別名ツリー オブジェクト) のみが保存されます。コンテンツは変更されていないため、Git はファイル コンテンツを格納するために新しい BLOB オブジェクトを作成する必要はありません。したがって、「コミットサイズ」はかなり小さくする必要があります。

差分サイズが大きいとおっしゃっていますので、移転に伴いファイル内容が一部変更されていると思います。これが、「コミットサイズ」が巨大になる理由です。

どちらの場合も、次のコマンドを使用して .git ディレクトリのサイズを縮小できます。git gc --prune --aggressive

編集 :

git mv foo bar
git commit -m "modify"
git cat-file -s HEAD:bar

これらのコマンドは新しいコミットを作成しますが、foo/bar ファイルの内容は変更されていないため、Git は新しいファイル名以外は何も保存しません。実際、あなたの例では、同じ内容(.git/objectsの同じblob)であるため、git cat-file -s HEAD:foo名前変更前と変更後では同じ結果が得られます。git cat-file -s HEAD:bargitが内部的に行うことを誤解していると思います。詳細な説明については、 Git オブジェクトを参照してください。

git はファイルではなくコンテンツを追跡することに注意してください。

于 2013-05-30T21:38:51.847 に答える