Подтвердить что ты не робот

Есть ли хорошие обходные пути для ограничения размера файла GitHub 100MB для текстовых файлов?

У меня есть текстовый файл размером 190 МБ, который я хочу отслеживать на github.

Текстовый файл является произносимым лексиконным файлом для нашего механизма преобразования текста в речь. Мы регулярно добавляем и модифицируем строки в текстовых файлах, а разности довольно малы, поэтому в этом смысле он идеален для git.

Тем не менее, у GitHub есть строгий предел размера файла 100 МБ. Я пробовал службу хранения больших файлов GitHub, но каждый раз, когда она менялась, она загружает новую версию всего файла 190 МБ, поэтому она будет быстро расти до многих гигабайт, если я пойду по этому пути.

Я хотел бы сохранить файл как один файл, а не разделять его, потому что это то, как работает наш рабочий процесс, и потребовалось бы некоторое кодирование, позволяющее нескольким текстовым файлам вводить/выводить в наши инструменты (и у нас мало ресурсы разработки).

Одна из моих идей заключалась в том, что, возможно, можно настроить некоторые предварительные и пост-фиксационные перехватчики для разделения и конкатенации большого файла автоматически? Возможно ли это?

Другие идеи?

Изменить. Я знаю об ограничении размера файла 100 МБ, описанном в похожих вопросах здесь, в StackOverflow, но я не считаю свой вопрос дубликат, потому что я прошу конкретного случая где разницы малы и часты (я не пытаюсь загрузить большой ZIP файл или что-то еще). Тем не менее, я понимаю, что git -lfs подходит только для файлов, которые редко меняются, и что нормальный git будет идеально подходит для типа файла, который я описываю; за исключением того, что GitHub имеет ограничение размера файла.

Обновление. Вчера я провел эксперименты с созданием небольшой кросс-платформенной программы, которая разбивает и объединяет файлы в более мелкие файлы с помощью git hooks. Это вроде работает, но не очень удовлетворительно. Вам нужно будет исключить ваш большой текстовый файл .gitignore, что делает git не осведомленным о том, изменилось ли оно. Разделенные файлы изначально не обнаруживаются с помощью git status или git commit и приводят к той же проблеме, что и в этом вопросе SO, что довольно раздражает: Pre-commit script создает файл mysqldump, но "ничего не зафиксировать (рабочий каталог чист)" ? Настройка задания cron (linux) и запланированной задачи (Windows) для автоматической регенерации разделенных файлов может быть исправлена, но это нелегко автоматически настроить, может вызвать проблемы с производительностью на компьютере пользователя и просто не очень элегантно решение. Могут также потребоваться некоторые хакерские решения, такие как динамическая модификация .gitignore, и вы никоим образом не получите разницу между фактическими текстовыми файлами, а только разделенные файлы (хотя это может быть приемлемо, поскольку они будут очень похожими). ​​

Итак, спать на нем, сегодня я думаю, что подход git hook не является хорошим вариантом, поскольку у него слишком много причуд. Как было предложено @PyRulez, я думаю, мне придется посмотреть на другие сервисы, кроме GitHub (к сожалению, так как я люблю github). Хостинг-решение будет предпочтительнее, если вам не удастся управлять нашим собственным сервером. Мне также хотелось бы, чтобы он был общедоступным...

Обновление 2. Я рассмотрел некоторые альтернативы GitHub, и в настоящее время я склоняюсь к использованию GitLab. Я связался с поддержкой GitHub о возможности повышения предела 100 МБ, но если они этого не сделают, я просто переключусь на GitLab для этого конкретного проекта.

4b9b3361

Ответ 1

Очистка и смазывание

Вы можете использовать чистую и 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.

В качестве альтернативы вы можете иметь чистую почту в онлайн-пастебине и вычищать из пастихина, например http://pastebin.com/. Многие другие комбинации возможны с чистым и пятнистым.

Ответ 2

Вы можете создать script/программу на любом языке для разделения или объединения файлов.

Вот пример, чтобы разделить файл, написанный на 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 (или любой другой язык) script для этого и сохранить его как обычный текст в вашем репозитории.

Ответ 3

Очень хорошим решением будет использование:

https://git-lfs.github.com/

С открытым исходным кодом, предназначенным для работы с большими файлами.