Gitの巨大ファイル管理、未来はGitそのものだった!?
引用元:https://news.ycombinator.com/item?id=44916783
俺がgit-bigstore
[0]を、Git LFS
が生まれる10年 (!) も前にこの問題解決のために作ったんだ。今でも完璧に動いてるはずだよ。.gitattributes
でファイルを指定して、2つのコマンドで同期するんだ。
GitHubがLFS
を出したから諦めてたけど、コメントを見る限りまだ需要がありそうだよ。ちょっと手を入れる必要はあるけど、アイデアはしっかりしてる。低レベルな実装についてはwiki
[1]に書いたから見てみて。
あと、すべてのメタデータはgit notes
を使って保存されてるから、完全にポータブルでフロントエンドに依存しないんだ(もちろん、ストレージバックエンド以外はね)。
[0]: https://github.com/lionheart/git-bigstore
[1]: https://github.com/lionheart/git-bigstore/wiki
Large object promisors
のアプローチはすごくいいな。S3みたいなものを使えるなら、俺もGit LFS
から乗り換えるよ。S3はVCS
で大きなBLOB
を扱うのにめちゃくちゃ相性良さそうだよな。インテリジェントな階層化機能で、古いデータが自然とコールドストレージに移動するのもいい。10年前のものをプルするのに半日かかっても、全然気にしないね。
記事でgit lfs
の代替としてgit annex
やdvc
がS3に対応してるって言ってるね(windows
だとシンボリックリンクのワークフローでちょっと面倒だけど)。GitLab
もgit lfs
をS3にオフロードしてるしね。どれも一長一短あるんだ。俺はだいたい迷わずLFS
を選ぶけど、ワークフローやインフラの要件に合えば他のも使うよ。
特に2GBのファイルとか、25MBのファイルだけじゃない場合は、ハッシュアルゴリズムと変更検出(いつそれが起こるか)が違いを生むんだ。
今の職場で、コスト削減のためにすべてのLFS
オブジェクトをバケットにキャッシュしてるんだ。PR
が実行されるたびに、git lfs ls-files
でオブジェクトリストを取得して、GCP
から同期、git lfs checkout
でリポジトリをLFS
オブジェクトストアから実際に埋めて、キャッシュされてない分はgit lfs pull
で取得。もし未キャッシュのオブジェクトがあれば、gcloud storage rsync
でアップロードしてる。シンプルだし、開発者は新しいオブジェクトをプルするだけでいいから設定も不要、GitHub UI
も混乱しない。GitHub
がCI
でのLFS
ファイルのプルにめちゃくちゃ課金してきたから、とりあえずこれで解決したんだ。もっとキャッシュサイズ増やせたり、キャッシュ制御が改善されたりするといいんだけどな。
RWX
でもLFS
ファイルをプルするときに、これと似たようなアプローチを使ってるよ [1]。git lfs ls-files
でLFS
ファイルのリストを取得して、そのリストをタスクに渡して、curl
を使ってLFS
エンドポイントから各ファイルをプルしてるんだ。RWX
ではタスクの出力は入力が変わらない限りキャッシュされるから、LFS
ファイルはRWX
キャッシュに残り、将来のCI
でのクローン時にそこからプルされるんだ。これによってGitHub
のLFS
帯域幅コストを節約できる上に、RWX
キャッシュからのリストアはgit lfs pull
よりもはるかに速いよ。
[1] https://github.com/rwx-cloud/packages/blob/main/git/clone/bi…
いいね!俺もプルスルーキャッシュを検討したんだけど、バケット以上のインフラ設定が不要なソリューションを選んだんだよ。
「キャッシュサイズをもっと増やせるようにしてほしい」って要望、GitHub
の公開ロードマップによると、Q3に対応予定みたいだよ:https://github.com/github/roadmap/issues/1029
素晴らしいね。技術的には今でも制限を超えられるけど(うちのは93/10GBって表示されてた)、追い出しポリシーが分からないんだ。もう少し払って、データが確実に残る方が安心できるな。
GitHub CI
でこれだけカスタマイズする手間をかけるなら、オープンソースCI
をローカルで動かすとか、Google
のEC2
みたいなものを使えばいいんじゃない?
GHAのaction.yml
でカスタムビルドを組むのに半日かかったけど、帯域とビルド時間を節約できたから投資の価値はあったね。今のビルドは全部GHAだし、他のシステムへの移行は考えてないよ。次はGHホストからGCEワーカーに移行してDockerキャッシュを温めたいな。GCEは4倍安いし、ビルドも速くなるはず!でも、僕がこれに取り組むには機会費用が高いんだよね。
へぇ、面白かったよ。GitLabとかGitHubのランナーって高いって聞いたから、ベアメタルサーバーでCIランナーをセットアップするのに時間使っちゃったことがあるんだよね。
公式のDockerビルドプッシュアクションって、GitHub Actionsキャッシュを使ったキャッシングはサポートしてないんだっけ?
そうなんだ。うちだとML依存関係で1イメージプッシュが10GB超えるんだよね。レイヤーキャッシュをサポートしてても、リリースブランチ間では共有できないし(https://github.com/docker/build-push-action/issues/862)。それに、複雑なビルドでキャッシュを確実に使うなら、Docker BuildXのディスク状態を使うのが一番信頼できるよ。今、リモートキャッシュだけで100%キャッシュされたリビルドができない問題があるんだ。Dockerチームに報告するべきだけど、最小限の再現手順がないし、俺のせいかもしれない可能性も10%あるんだよね。
Depot(https://depot.dev)を試してみてよ。俺はDepotの創設者なんだけど、これ、まさに僕らが作った目的の一つなんだ。レイヤーキャッシュを実際のNVMeデバイスに永続化して、ビルド間で自動で再アタッチするから、ネットワーク経由とかGitHub Actionsのキャッシュの制約を気にする必要がなくなるんだ。
そうそう、同感だよ。なんで最初からそれがデフォルトじゃなかったのか不思議だけど、出始めの頃はまだ一般的じゃなかったのかな。だから僕は小さいGit LFSサーバーを自分で動かしてるんだ。GitがS3をネイティブでサポートするようになったら、すぐにでもそっちに切り替えるつもりだよ。
今はね、GitHubのリポジトリにあるLFSファイルを、僕のhomelabにあるMinIOインスタンスに保存するためにhttps://github.com/datopian/giftlessを使ってるよ。S3とLFSを繋ぐ他のプロジェクトもいくつかあるけど、この設定が一番うまくいってるんだ。
でもさ、Gitクライアントって、なんでこれに特定のサポートが必要なの?Gitホストが特定のオブジェクトのリクエストを別のホストにリダイレクトして、それらをバンドルにパックするのを、今、何が邪魔してるの?
独自のS3互換ストレージシステムはオンプレミスにインストールできるんだよ。ScalityやJuiceFSみたいなシンプルなデーモンから、TrueNASみたいな小規模アプライアンス、Cephみたいな本格的なストレージクラスターまで色々あるね。OpenStackにはSwiftっていう独自のオブジェクトストレージサービスもあるし。データセンター向けなら、富士通、レノボ、ファーウェイ、HPEとかの大手企業が、高速なS3対応「オブジェクトストレージ」を喜んで売ってくれるよ。
CIやローカル開発テストには、DockerコンテナでAWSサービスを模倣するLocalstackが使えるよ。
Localstackは面白いね。うちはAWS使ってないけど、AWSユーザーにはいい選択肢だ。ScalityのオープンソースS3 Serverもコンテナで動くよ。
S3はAmazonのオブジェクトストレージサービスの名前だよ。互換APIを持つ他社のソリューションをS3と呼ぶのはちょっと違う気がするな。
AWSの’クラウドストレージサービス’のことだよね。
実際は’Simple Storage Service’の略で、S3なんだよ。
記事がGit LFSをプロプライエタリでベンダーロックインって批判してるけど、GitHubがオープンなクライアントとサーバーを提供してるから公平じゃないね。LFSはオフライン操作を壊すけど記事は触れてない。Promisorsも同じだろうな。git partial clone
の例はいいね!Large Object PromisorsはLFSの複雑さをサーバー側に移し、さらに複雑にしてるように見えるな。クライアントはGitサーバーにアップロードし、Gitサーバーがオブジェクトストアにアップロード、クライアントはオブジェクトストアから直接ダウンロードするのか?公開Gitサーバーが隠れたpromisorリモートにアップロードするケースがどれくらい問題になるか気になるよ。
Git LFSはマジでダメ。サーバー実装がひどいし、ファイルの中身と保存方法を混同してる。オプトインのやり方も最悪で、普通にやると欲しいファイルじゃなくて、小さなテキストファイルになっちゃうんだ。彼らのソリューションが良いかは分からないけど、LFSがダメなのは間違いないよ。
大きなファイルはリポジトリに保存せず、別に管理するべきだと思う。そういう使い方には出会ってないけど、コードと一緒にデカいファイルをリポジトリに入れるメリットがよく分からないな。
それは多くのケースで無理だよ。デカいファイルだってコードと同じようにブランチを切ったり、いつなぜ変わったか知ったり、古いバージョンでどう動いたかチェックしたりする必要があるんだ。コードは小さいことが多いけど、だからってプログラムの全てのソースファイルが小さいわけじゃないんだからさ。
そうだけど、Gitはそのためのツールじゃないんだよ。なんでみんな’Gitを使わなきゃ’って思ってるのか分からないな。バージョン管理や追跡は、他にもいろんな方法でできるんだからさ。リポジトリにはリンクみたいな参照だけ保存すればいいじゃない。
この新しい提案もLFSと同じ問題を抱えてる気がするなー。プロミサーにアクセスできないと、ラージファイルが壊れるっていう同じ問題が起こるんじゃない?
なんでだよ?この提案は git lfs install
を実行しなくても、ちゃんとファイルを取得できるはずだけど?
もっとコメントを表示(1)
LFSのダメなところは他にもあるんだ。リポジトリを移行すると、LFSオブジェクトがない過去のコミットにまで.gitattributes
が追加されちゃうんだよ。例えばCコミットでラージファイルを追加しても、AやBコミットまでLFS参照が入っちゃうってこと。
そんなはずないだろ。前のコミットにファイルが追加されるなんてこと、あるわけないじゃん。ハッシュが変わっちゃうから、色々なものがぶっ壊れちゃうぞ!
Git LFSってさ、SSHだと動かなかったんだよね。SSL証明書が必要で、GitHubもそれがセルフホストする人にはハードルだって分かってたみたい。GitLabはSSH対応のパッチを当てた気がするけど。
git lfs migrate
はコミットを書き換えちゃうから、ハッシュは変わるんだよ。これは公式ドキュメントにも書いてある。普通は新しいコミットだけが対象だけど、俺はリポジトリ全体をLFS化したかったから、過去のコミットまで.gitattributes
が汚染されてガッカリしたよ。詳しくはここを見てくれ!
https://github.com/git-lfs/git-lfs/blob/main/docs/man/git-lfs-migrate.md
もしアーキテクチャがどうでもよくて、デフォルトでオンにするだけなら、Git LFSでもとっくにできてたはずだろ。
ドキュメントの2パラグラフ目にこう書いてあるぞ、「git lfs migrate
はデフォルトで現在チェックアウト中のブランチと、リモートにないコミットで追加されたファイルだけを操作する」って。もしかしてリモートの設定が間違ってたんじゃないの?
Let’s Encryptはさ、Git LFSが始まる3年前にローンチしてるんだぜ。
「Gitはそういうツールじゃない」って言ってるけど、それはGitがラージファイルの追跡がまだ得意じゃないからであって、Gitの根本的な特性じゃないだろ。改善できるはずだよ。あと、「GIT」じゃなくて「Git」ね。
バージョン管理システムはプロジェクト管理のツールで、ソースコード専用じゃないんだ。プロジェクトを複数のストレージに分けるのは、管理上ありえない。みんな一緒にしたいのは、デジタルファイルのプロジェクト管理の基本機能として、全部まとまってるのが大事だからだよ。デジタルファイルのバージョン管理や、リリース・ビルド計画との連携は必須なんだ。それが実際のプロジェクトの要求だね。デジタルアセットを含むプロジェクトは、バイナリや大きなデータファイルがつきものだし、テキストファイルだけってプロジェクトはむしろ珍しい。Linuxカーネルは、グラフィックとか大きな固定データがないから独特なんだ。Gitプロジェクトの全てが小さなテキストファイルじゃなきゃダメって考えは、マジで変だよ。ビデオゲーム、ウェブサイト、ウェブアプリ、データ駆動API、地理データ、画像、動画、音楽、ドキュメント…どれもバイナリファイルを使うでしょ?
選択肢は二つ。
1. Gitは、現実のプロジェクトに役立つ汎用VCSである。
2. Gitは、バイナリや大きなファイルを許可しない。
大きなファイルのバージョン管理って、そんなに複雑な問題じゃないんだ。差分やマージを気にしなくていいなら、管理はもっと簡単になるよ。
Git LFSがデフォルトでできないのは、次の理由からだね。
1. Gitとは別にインストールが必要。
2. GitフィルターやGitフックを使うから、ローカルでの設定が必要。
Gitに最初から組み込まれていれば、こんな問題は起きないのにね。
また同じこと言うけどさ、『俺の場合はリポジトリ全体をLFSに変換してた』って言ったじゃん。マニュアルの”INCLUDE AND EXCLUDE REFERENCES”ってセクションをチェックしてみてよ。
クラウドストレージからオブジェクトがなくなったり、ストレージが何度も移行されて、アーカイブに必要な古いストレージが使えなくなっちゃったらどうなるの?
そういう場合はエラーになるのは当然だよね、良くないけど。でも、元の人は、Git LFSにはネイティブなGitじゃ起こらない種類のエラーが他にもあるって指摘してたんだ。例えば、Gitアクションを途中で中断すると、Git LFSでは一貫性のない状態になっちゃうけど、ネイティブGitならそんなことは起こらないんだ。
Let’s Encryptは2012年に設立されて、2015年12月に一般公開されたね。Git LFSは2014年半ばだから、だいたい同じくらいの時代だ。
Gitが大容量ファイルの追跡に優れていないのが欠陥だとか、それが改善点だとかいう意見には反対したいね。
でも、もし問題がそれだけだったなら、LFSプラグインをGitのコア部分にすればよかっただけなんじゃないの?
OK、君の主な不満は、以前のコミット全てに.gitattributesが追加されることだったんだよね?もし誰かが昔のコミットに.binファイルを追加した場合、それでもLFSに入れたいと思うでしょ?“現在のコミットとの相互参照”がどういう意味なのか、俺にはちょっと分からないな。mainとか別のブランチの.gitattributesを使いたい理由も分からないし。明示的に指示されない限り、別のブランチを参照する操作って、すごくGitらしくない気がするんだけど。まあ、とにかく、LFSは履歴に適用しようとすると履歴を書き換えるのは確かだね。それが最善じゃないのは同意するよ。履歴をめちゃくちゃにして、特定のGitハッシュへのリンクを壊すリスクもあるしね。
大事なのは、二つの履歴を分けたくないってことだよ。もし君のユースケースが大容量ファイルにすごく依存してるなら、このユースケースにもっと向いている別のSCM(SVN、Perforceとか)を選ぶべきだね。でも、ファイルごとに違うSCMを使うのは、もう最悪な結果になるだけだよ。
ラージファイルを特別扱いする現在のGit LFSのような設計は根本的な問題だと思う。公式の新しいシステムも結局同じような振る舞いになりそうだよね。UXの問題は解決してほしいけど、Gitメンテナがちゃんと改善してくれることを祈るしかないなぁ。
自然に解決するとは思えないんだよね。
もし今の問題がなくなったら、それはもはやGit LFSじゃなくて、全然別のものになるんじゃないかな。
Git自体は良いツールなんだよ。ただ、このラージファイル管理の仕事には向いてないだけなんだ。
問題なのは、リポジトリでGit LFSを使い始めるのとは違って、移行する時にはメタデータが「過去に遡って」伝わることなんだ。
これじゃあ、実際のコミットにある内容が反映されないんだよね。
LFSってオフラインでの操作を壊しちゃうって話、僕も同じこと思ったよ。
Git annexはもっと分散的で、いろんなリモートにあるラージファイルの存在を追跡できるんだ。
USBドライブみたいなファイルシステムリポジトリからでもラージファイルを引っ張ってこれる。
でも、めっちゃ複雑で使いにくいのが欠点だよね。
この記事はGit LFSを不公平に扱ってると思うな。Git LFSはGitHubにロックインするわけじゃないし、プロトコルはオープンだよ。
Git拡張としてのLFSの欠点は避けられないんだ。PromisorsはLFSと同じコンセプトだけど、Gitに組み込まれてるからもっと良いUXを提供できるんだよね。
一度Git LFSをリポジトリで使うと、永久にロックインされちゃうんだ。
消費されたスペースを削除するには、GitHubからリポジトリを消すしかないって知ってた?
こんな振る舞いはどこにも明記されてないし、僕の会社でGitHubの統計調査してた時、ラージな圧縮データベースを保存するのに使ってて困ったよ。
これってGitとGitHubを混同してるよね。GitHubはひどいってのは今に始まったことじゃない。
Git自体は問題ないし、Git LFSはGitの拡張機能だよ。
Git LFSの仕様にはストレージの課金の話なんてないし、誰だってより良いサーバーを書けるんだから。
Gitの利用は圧倒的にGitHub経由だから、GitとGitHubを切り離して考えるのは難しいよ。
他の使い方はほとんど誤差みたいなものだしね。
だから、一番人気のGitホストで一番使われてるGitのラージファイル拡張機能が、ユーザーをロックインするってのは、知っておくべきめちゃくちゃ役立つ情報なんだ。
それって、すごく悪いロジックだよ。その論理だと、GitHubがダメだからGitもダメってことになるじゃん。みんながそれを混同するたびに、俺はイライラするんだよね。もっとちゃんと知ってるなら、なんで…?GitHubがダメだって言うだけでいいじゃん。
>圧倒的にGitはGitHub経由で使われてる。他は誤差程度
これって本当?俺は商用でGitを5社で使ったけど、GitHubを商用で使ったことはないよ(オープンソースプロジェクトのプラットフォームとしては別だけど)。
GitHubにプロジェクトをホストしてたら、GitHubに依存してることになるけど、ロックインされてるわけじゃないよね?GitHubのリポジトリを閉じて、他のとこに移行できるんだから。何か見落としてるかな?
>でもロックインされてない、他のとこに移行できるから。
Git LFSを使っていたら、リポジトリをフォークして書き換えて、.lfsconfigのバックエンドURLを更新しないと、まともに動く状態に戻せないよ。
もっとコメントを表示(2)
>そして問題は大きい:
>高いベンダーロックイン – GitHubがGit LFSを作ったとき、他の大容量ファイルシステム—Git Fat、Git Annex、Git Media—はサーバーサイドに依存しなかった。でもGitHubは独自のサーバー実装にユーザーをロックインして、利用料を徴収した。
これって今でも問題なの?
俺は今週Git LFSをGitLabインスタンスで使ったけど、問題なく動いたみたいだよ。
https://docs.gitlab.com/topics/git/lfs/
その1週間前にもGiteaインスタンスでGit LFSを使ったけど、これも問題なかった。
https://docs.gitea.com/administration/git-lfs-setup
LFSが将来的に非推奨になるとかいう話を聞く一方で、使ってる人をほとんど見かけないから、みんな気にせず画像とかを普通のGitに突っ込んでるのが、なんか不思議なんだよね。
Gitコアでデカいファイルをサポートしてくれるのは本当に嬉しいよ。外部のソリューションだと、結局同じようなオプトインの手続きが必要になるしね。俺はできるだけコマンド少なく、シームレスに動いてほしかったから、APIは’.gitattributes’ファイルのsmudgeとcleanフィルターに限定したんだ。
ベンダーロックインをなくすために、AtlassianやMicrosoftとかなり早い段階から直接協力したんだ。特にAtlassianにはファイルロックAPIでたくさん助けてもらって、素晴らしい協力関係だったよ。LFSはオープンソースとして、3つの異なるGitホストで互換性ありでリリースされたんだ。
いや。これは解決策じゃない。
Git LFSは今のところごまかしに過ぎないし、クローン操作中にフィルター引数を書くのも長期的な解決策にはならないって。git clone
って、ほとんどの人がGitを学ぶ時に最初に実行するコマンドじゃん?強調しとくけど、最初のコマンドだよ。
フィルターを書くことを覚えてくれるかな?多分、クールなコードベースのチュートリアルに書いてあれば覚えてくれるかもしれない。でも、もし書いてなかったら?気づかないまま時間がかかるかもしれない。もし覚えたとしても?クローンしたリポジトリはコンパイルできなかったり、使えなかったりするかもしれない。だってblobが欠けてるんだからね。
仮にちゃんとできたとしても、みんな理解できるかな?ほとんど無理だよ。俺たちはGitの内部構造を、みんなが最初に学ぶコマンドで晒してるんだ。「blobって何?」「なんでフィルターが必要なの?」「blobはどこに保存されるの?」って、まさに抽象化の漏洩じゃん。
これってRsyncがやってて、もう解決済みの問題だよ。その実装をただ持ってくるだけでいいんだ。つまり、代替の表現をサポートするか、blobを完全にやめるってことなんだけど、Gitのメンテナーたちはそうしたくないみたいだね。
>これは解決済みの問題: Rsyncがやってる。
どんな解決策なのか説明してくれる?Rsyncアルゴリズムの詳細じゃなくて、ユーザーから見てどうなるのかを知りたいんだ。「git clone」したら、ローカルファイルシステムにどんなファイルがあるの?
シャロークローンならファイルは何も存在しないけど、フルクローンだと各バージョンの各blobがフルコピーで手に入るんだ。そして提案されてるのは、各リビジョンを最後のRsync操作として扱うってこと。ファイルをいじる回数が多いほど、それはアセットでもそうだし、コードの正確なスナップショットを取るために依存関係をチェックインした場合でもそうだけど、それがたくさんの大きなファイルの変更になるんだ。
画像や音声、動画みたいなほとんどのデカいアセットは、Rsyncアルゴリズムを使ってもメリットはほとんどないよ。ファイルをちょっと「調整」しただけでも、フォーマット的にはバイトレベルでめちゃくちゃ大きな違いが出ちゃうのが普通だからね。
動画はGitの範囲外かもしれないね。YouTubeですら動画の「更新」はできないんだから。
これ、めちゃくちゃ変に聞こえるかもしれないけど、動画のソースコードをスクリプトにしちゃって、ビルドするプロセスで動画を作って、それをリリース用の成果物にするのはどうかな?
Gitってさ、昔からフラグ追加して問題解決するけど、99%のユーザーはそんなの絶対見つけないよね。デフォルト設定を直そうとしないんだよな。後方互換性壊さずにデフォルトを変えることだってできるのにさ。
「デフォルトを直さない」ってのはちょっと違うんじゃない?Git 2.0でpushのデフォルト設定を”matching”から”simple”に変えたことあったじゃん。
Gitの肥大化ってほとんどが過去の履歴が原因って言うのは間違ってる?もしそうなら、最新バージョンのファイルだけをrsyncみたいにダウンロードするアプローチが一番いいんじゃないかな?ほとんどの人はそれだけで十分なはずだしさ。
「止まった時計が2度目に正しかったのはいつ?」って話だけど、俺は前のコメントに同意。Gitコミュニティって、チームの問題を解決するのに、デフォルト設定できないような一時しのぎの修正ばっかするんだよな。sparse checkoutとかコミット後のノート追加とかさ。これって、プルやプッシュするたびにめちゃくちゃ手間がかかるってことじゃん。IDEからは絶対使えないし。ホントの修正の邪魔をしてるだけだよ。
「Gitの肥大化ってほとんどが過去の履歴が原因?」ってのは、俺の経験からすると違うと思う。リポジトリをシャロークローンしても、容量の節約って思ったほどじゃなかったんだ。つまり、履歴はかなり効率的に保存されてるってことだね。
俺はGitが出たときから使ってるけど、IDEで使ったことなんて一度もないよ。ツールをちゃんと学ぼうとしないユーザーがターゲットになるべきなの?もちろん、インターフェースが大事じゃないとは言わないけどさ。俺はjqのインターフェースは最悪だと思ってるけど、Gitで同じように使いこなせないなんて想像できないんだよね。
ちょっと調べてみた感じだと、Gitはガベージコレクションで余計なファイルをちゃんと消してるから、前のコメントの「履歴は効率的」って話は合ってそう。でもさ、GitはMercurialみたいに差分じゃなくて、完全なファイルを保存してるんだよね。だから、やっぱり今のスナップショットだけを先にダウンロードするってやり方が効果あるかもな。
マジそれな!もしGitでデカいファイルが使えないなら、それはGitのバックエンドとかクローン機構が悪いってことだよ。そこをちゃんと直して、次のステップに進もうぜ。
「フィルターを書くの忘れる?」って話だけど、フィルターを書くのを忘れたって全然問題ないんじゃない?もし作業に10分以上かかってるなら、その時にフィルター書けばいいんだし。
「ビデオのソースコードはスクリプトで、ビルドしたらリリース版のビデオができるって、これってありえない話?」って提案だけど、実はそういうのってある程度もう実現されてるんだよ。でもそれって、すべての元映像にアクセスしなきゃいけないし、高品質でちゃんと圧縮されたビデオファイルをレンダリングするのにはめちゃくちゃ時間かかるんだよね。詳しくはこれ見て。
https://en.wikipedia.org/wiki/Edit_decision_list
これってかなりニッチだけど、アニメのファンエンコードで使われてるよ。一部のグループはVapoursynthスクリプトを公開してて、同じ元動画があれば同じ再エンコードができるんだ。例えば、LightArrowsEXEのEncoding-ProjectsやBeatrice-Rawsのencode-scriptsを見てみて。
https://github.com/LightArrowsEXE/Encoding-Projects
https://github.com/Beatrice-Raws/encode-scripts
え?なんで初心者に意味なく10分も待たせるわけ?自分が何間違えたのか、どれくらい待つのが普通なのか、どうやって分かるの?ChatGPTに「Gitクローンが10分かかるのはなぜ?」って聞けってこと?!ユーザー体験としてこれがベストなわけないよ。Gitはもっと改善する必要があるね。
まさにそれだよ、今回の変更で対応してるんだけど、デフォルトにならないのは、多くの人がGitにテキストしか置いてないから、これらの変更によるデメリットを避けたいんだよね。
Gitは論理的には完全なファイルを保存するモデルだよ。でも物理的には、これらの完全なファイルはpackファイル内で差分(deltas)として保存されてるんだ。まだパックされてない新しいファイルは別だけどね。デフォルトでは、Gitはたくさんのloose filesがあると自動的にパックするし、ネットワークプロトコルで送受信するときも常にパックされるよ。
手動フィルターが最善策かは分からないけど、これで多くの足りない部分が補われる気がするね。Gitの初回コミット時みたいに、デフォルトのグローバルフィルターサイズに引っかかるリポジトリをクローンした時に、無効化する方法を教えてくれると良いな。「クローンしたリポジトリはブロブがないからコンパイル/使用できないかも」ってあったけど、LFSみたいに大きいファイルの全履歴ダウンロードを防いで、必要なバージョンだけチェックアウトするのがフィルターの目的なんじゃないの?1バイトのフィルターでもワーキングツリーは使えるけど、過去のコミットをチェックアウトしようとすると全ファイルダウンロードが必要になるってことかな。
うーん、動画自体は「アニメX シーズン1 第5話」みたいなインデックス可能な識別子で参照されるんだろうね。実際の動画のプロビジョニングは、ビルドする人が(多分Torrentネットワークか、誰もやらないだろうけどDVDから)入手することになるんだろうな。
それは「ビルド」を瞬時に終わるもの、あるいは数時間で完了するものと見なす場合に限った問題だね。科学における再現性と似てるよ。LHCみたいに再現がとてつもなく高価な実験もあるけど、技術的には再現可能なんだ。
「クローンしたリポジトリはブロブがないからコンパイル/使用できないかも」って話だけど、ブロブの履歴だけがフィルターされるんだよ。
多くの動画編集って、動画全体の作り直しじゃなくて、一部の映像を繋いだり削除したりすることなんだよね。こういう使い方なら、ローリングハッシュを使うrsyncがすごく役立つはずだよ。