Githubで追跡したい190 MBのプレーンテキストファイルがあります。
テキストファイルは、テキスト読み上げエンジン用の発音レキシコンファイルです。テキストファイルの行を定期的に追加および変更しますが、差分はかなり小さいため、その意味でgitに最適です。
ただし、GitHubには100 MBの厳密なファイルサイズ制限があります。 GitHub Large File Storageサービスを試しましたが、変更するたびに190 MBファイル全体の新しいバージョンがアップロードされるため、そのパスをたどるとすぐに数ギガバイトになります。
ファイルを分割するのではなく、oneファイルとして保持したいと思いますツール(および開発リソースはあまりありません)。
私が持っていたアイデアの1つは、大きなファイルを自動的に分割して連結するために、いくつかのプリコミットおよびポストコミットフックを設定することができるということです?それは可能でしょうか?
他のアイデア?
Edit:StackOverflowの同様の質問で説明されている100 MBのファイルサイズの制限を認識していますが、重複しているとは考えません。差分が小さく頻繁に発生する特定のケースを求めています(大きなZipファイルなどをアップロードしようとはしていません)。ただし、私の理解では、git-lfsはまれに変更されるファイルにのみ適切であり、通常のgitは説明する種類のファイルに最適です。ただし、GitHubにはファイルサイズの制限があります。
Update:昨日、gitフックを使用してファイルを分割して小さなファイルに結合する小さなクロスプラットフォームプログラムを作成する実験に費やしました。それは一種の作品ですが、本当に満足のいくものではありません。大きなテキストファイルを.gitignoreで除外する必要があります。これにより、gitが変更されたかどうかを認識できなくなります。分割ファイルは、最初はgit status
またはgit commit
によって検出されず、このSOの質問、これは非常に迷惑です: コミットスクリプトはmysqldumpファイルを作成しますが、「コミットするものはありません(作業ディレクトリはクリーン)」? cronジョブ(linux)とスケジュールされたタスク(windows)を設定して、分割ファイルを自動的に再生成します自動的にセットアップされ、ユーザーのコンピューターでパフォーマンスの問題が発生する可能性があり、あまり洗練されたソリューションではありません。gitignoreを動的に変更するなどのハッキングソリューションも必要になる場合があります。分割されたファイルのみ(非常によく似ているため許容できるかもしれませんが)。
だから、今日は、あまりにも多くの癖があるので、今日はgitフックアプローチは良い選択肢ではないと思います。 @PyRulezによって提案されたように、GitHub以外のサービスを見る必要があると思います(残念ながら、githubが大好きなので)。ホストされたソリューションは、独自のサーバーを管理する必要を避けるために望ましいでしょう。また、一般公開されるようにしたい...
Update 2:GitHubに代わるものをいくつか見てきましたが、現在はGitLabの使用に傾倒しています。 100MBの制限を引き上げる可能性についてGitHubサポートに連絡しましたが、もしそれができない場合は、この特定のプロジェクトのGitLabに切り替えます。
Cleanとsmudgeを使用して、ファイルを圧縮できます。通常、gitは内部で圧縮するため、これは必要ありませんが、gitHubは奇妙な動作をするので役立つかもしれません。主なコマンドは次のとおりです。
git config filter.compress.clean gzip
git config filter.compress.smudge gzip -d
GitHubはこれを圧縮ファイルとして認識しますが、各コンピューターではテキストファイルのように見えます。
https://git-scm.com/book/en/v2/Customizing-Git-Git-Attributes を参照してください。
または、オンラインPastebinにクリーンポストを作成し、 http://Pastebin.com/ のようにPastebinからフェッチを汚すこともできます。他の多くの組み合わせは、きれいで汚れています。
任意の言語でスクリプト/プログラムを作成して、ファイルを分割または結合できます。
ここで、Java(私はJavaを使用したため、Javaその他、ただし他の機能は動作しますが、一部はJavaも)よりも優れています。
public static void main(String[] args) throws Exception
{
RandomAccessFile raf = new RandomAccessFile("test.csv", "r");
long numSplits = 10; //from user input, extract it from args
long sourceSize = raf.length();
long bytesPerSplit = sourceSize/numSplits ;
long remainingBytes = sourceSize % numSplits;
int maxReadBufferSize = 8 * 1024; //8KB
for(int destIx=1; destIx <= numSplits; destIx++) {
BufferedOutputStream bw = new BufferedOutputStream(new FileOutputStream("split."+destIx));
if(bytesPerSplit > maxReadBufferSize) {
long numReads = bytesPerSplit/maxReadBufferSize;
long numRemainingRead = bytesPerSplit % maxReadBufferSize;
for(int i=0; i<numReads; i++) {
readWrite(raf, bw, maxReadBufferSize);
}
if(numRemainingRead > 0) {
readWrite(raf, bw, numRemainingRead);
}
}else {
readWrite(raf, bw, bytesPerSplit);
}
bw.close();
}
if(remainingBytes > 0) {
BufferedOutputStream bw = new BufferedOutputStream(new FileOutputStream("split."+(numSplits+1)));
readWrite(raf, bw, remainingBytes);
bw.close();
}
raf.close();
}
static void readWrite(RandomAccessFile raf, BufferedOutputStream bw, long numBytes) throws IOException {
byte[] buf = new byte[(int) numBytes];
int val = raf.read(buf);
if(val != -1) {
bw.write(buf);
}
}
これはほとんど費用がかかりません(時間/お金)。
編集: Java実行可能ファイルを作成してリポジトリに追加できます。さらに簡単に、Python(または他の言語)これを行うスクリプト、およびリポジトリにプレーンテキストとして保存します。