web-dev-qa-db-ja.com

git lfsは何を移行しますか?

git lfs migrateは、指定された大きなファイルがLFSに保持されるように、リポジトリの履歴を書き直したと思いました。これは、大きなファイルのすべてのバージョンが直接含まれているわけではないため、リポジトリが小さくなることを意味します。ただし、実行すると

git lfs migrate import --include="test-data/**" --include-ref=refs/heads/master

test-data/ディレクトリ内のすべてのファイルは、次のようなファイルに置き換えられます。

version https://git-lfs.github.com/spec/v1
oid sha256:5853b5a2a95eaca53865df996aee1d911866f754e6089c2fe68875459f44dc55
size 19993296

そして、.gitフォルダーは2倍の大きさになります(400MBから800MB)。私は混乱しています。 git lfs migrate doingとは

編集:私はしました 移行後にクリーン

git reflog expire --expire-unreachable=now --all
git gc --Prune=now

duを実行する前。その後、ほとんどのスペースはこれらのフォルダーによって使用されます。

414M .git/objects 398M .git/lfs

7
Mohan

唯一の問題は、バイナリファイルの元のgitオブジェクトが.gitフォルダーをガベージコレクションしていないためです。

git lfs移行チュートリアル に従ってください:

上記は、既存のgitオブジェクトをlfsオブジェクトに正常に変換します。ただし、通常のオブジェクトは.gitディレクトリに残ります。これらは最終的にgitによってクリーンアップされますが、すぐにクリーンアップするには、次のコマンドを実行します。

git reflog expire --expire-unreachable=now --all
git gc --Prune=now

実行後、.gitは同じサイズになるはずですが、それに入ると、objectsが移行前よりもはるかに小さくなり、残りのlfsに残ります。 。

さらに良いニュースは、他の開発者/アプリケーションがリポジトリを複製するときに、objectsディレクトリをダウンロードするだけで、only履歴全体ではなく、チェックアウトした「大容量ファイル」。

5
Ido Ran

Git lfs migrateは、指定された大きなファイルがLFSに保持されるように、リポジトリの履歴を書き直したと思いました。

完全に真実です。

これは、大きなファイルのすべてのバージョンが直接含まれているわけではないため、リポジトリが小さくなることを意味します。

正確ではない。 git lfsの約束は、リポジトリが小さくなることではありませんが、クローンを作成するときに、すべてのgitオブジェクトをダウンロードする必要がないため、クローンが小さくて高速になります。 git-lfsが管理するファイルの場合、git checkoutの実行中に作業ディレクトリに表示されるはずのファイルのみがダウンロードされます。

Test-data /ディレクトリ内のすべてのファイルは、次のようなファイルに置き換えられます。

これがgit-lfsの仕組みです。リポジトリ内のファイルをコミットする代わりに、オブジェクトのIDを含むこの「ポインタ」ファイルをコミットします。ファイルの内容は.git/lfs/objectsフォルダーに保存されます。そして、これらのオブジェクトは、git Pushを実行するときにサーバーにアップロードされます。

そして、.gitフォルダーは2倍の大きさになります(400MBから800MB)。私は混乱しています。

Git lfsによって管理されるすべてのファイルがこのフォルダーに格納されるため、巨大になる可能性があります。現時点ではオブジェクトが2回保存されているため、リポジトリのサイズが2倍になると思います。 .git/objectsで、古い履歴を破棄するまで reflogをパージしてgit gc を実行します。ただし、lfsの移行が確認できたら、成功)と.git/lfs/objectsでは、git lfs変換を行ったためです。

(確かではありませんが).git/lfs/objectsはキャッシュフォルダーとして機能するので、新しい履歴をすべてプッシュし、lfsで管理されているファイルをアップロードしたら、削除してリポジトリのサイズを小さくすることができます。 しかし、私があなただったら、私はそれをしません!

ローカルリポジトリでのgit lfsの実際の効果を確認するには、--forceが新しい履歴をプッシュした後(および古い履歴がリモートリポジトリになくなった場合)、新しいクローンを作成します。そして今、あなたのローカルリポジトリはより小さくなければなりません。

ただし、これらのファイルの新しいバージョンがダウンロードされるたびに、フォルダー.git/lfs/objectsは今後も大きくなります(ただし、git lfsを使用しなかった場合より常に小さいはずです)。

それがどのように機能するかをもっとよく理解してほしい...

PS:

Test-data /ディレクトリ内のすべてのファイルは、次のようなファイルに置き換えられます。

あなたの言ったことの一部が間違っているといいのですが。 test-data/のファイルにはまだ良いコンテンツが含まれていますが、報告するのはgitコマンドが表示するものです...確認できますか?または、問題があります... git lfsがインストールされていないことが原因と考えられます。

3
Philippe