Керування великими бінарними файлами за допомогою Git


523

Я шукаю думки, як обробляти великі двійкові файли, від яких залежить мій вихідний код (веб-додаток). Зараз ми обговорюємо декілька альтернатив:

  1. Скопіюйте двійкові файли вручну.
    • Pro: Не впевнений.
    • Контраст: Я категорично проти цього, оскільки це збільшує ймовірність помилок під час створення нового веб-сайту / міграції старого. Створює ще одне перешкоду, яке потрібно зробити.
  2. Керуйте ними всіма за допомогою Git .
    • Pro: видаляє можливість "забути" скопіювати важливий файл
    • Контраст: розкриває сховище і зменшується гнучкість управління базою коду, а каси, клони тощо потребують досить тривалого часу.
  3. Окремі сховища.
    • Про: Перевірка / клонування вихідного коду відбувається швидко, як ніколи, і зображення належним чином архівуються у власному сховищі.
    • Контраст: Вилучає простоту створення одного і єдиного сховища Git у проекті. Це, безумовно, вносить деякі інші речі, про які я не думав.

Які ваші переживання / думки щодо цього?

Також: Хтось має досвід роботи з декількома сховищами Git та керуванням ними в одному проекті?

Файли - це зображення програми, яка генерує PDF-файли з тими файлами в ній. Файли не змінюватимуться дуже часто (як у роки), але вони дуже стосуються програми. Програма не буде працювати без файлів.


26
А як щодо того, коли потрібна версія управління бінарним файлом? Я думаю про колективи художників, що працюють над активами.
День

3
Якщо це необхідно, вам доведеться збалансувати наявні ресурси (диск, пропускну здатність, час процесора) з урахуванням отриманих вами переваг.
пі.

4
Зауважте, що без блокування файлів git не чудовий, коли декілька людей потребують роботи над тим самим бінарним файлом.
yoyo


Відповіді:


177

Якщо програма не працюватиме без файлів, здається, розділення їх на окремий репо - це погана ідея. У нас є великі тестові набори, які ми розбиваємо на окремий репо, але це справді "допоміжні" файли.

Однак ви, можливо, зможете керувати файлами в окремому репо-файлі, а потім скористатися, git-submoduleщоб втягнути їх у ваш проект здоровим чином. Отже, ви б все ще мали повну історію всього свого джерела, але, як я розумію, у вас буде лише одна відповідна редакція підмодуля ваших зображень. git-submoduleЗасіб має допомогти вам зберегти правильну версію коду відповідно до правильною версією зображення.

Ось хороший вступ до підмодулів з Git Book.


11
"наскільки я розумію, у вас буде лише одна відповідна редакція вашого підмодуля зображень." Я не думаю, що це правильно.
Робін Грін

22
Справді. Підмодуль - це повне сховище Git, яке просто буває вкладене всередині батьківського сховища. Це знає всю його історію. Ви можете вчинити в ньому рідше, але якщо ви зберігаєте в ньому ті самі речі, які ви мали б у батьків, у нього будуть ті самі проблеми, що і у батьків.
Каскабель

5
Це досить бідне рішення, якщо у вас є великі бінарні файли, які змінюються через деякий регулярний інтервал. У нас є сховище, яке жахливо роздуте, оскільки в ньому зберігається новий бінарний файл з кожною збіркою. Якщо ви не в Windows, як зазначено нижче, додаток - це гарне рішення. Якщо ви працюєте в Windows ... доведеться просто шукати.
А. А. Грапсас

4
Ще одна проблема наявності великих двійкових файлів у репо-файлі - продуктивність. Git не був розроблений, щоб впоратися з великими бінарними файлами, і як тільки розмір репо піднімається до 3G +, продуктивність швидко падає. Це означає, що наявність великих файлів у репо-файлі обмежує ваші можливості хостингу.
Зуль

Підмодулі можуть знизити вимоги до передачі даних, якщо ви творчо неправильно використовуєте підмодуль: коли ви хочете оновити вміст підмодуля, створіть нову комісію без батьківського, а потім вкажіть суперпроект (main git repo) на щойно створений комітет без батьківського. Логічно це створює відключену історію для підмодуля, але взамін будь-яку версію підмодуля простіше перенести, оскільки ця версія не має історії.
Мікко Ранталайнен

310

Нещодавно я відкрив git-annex, який мені здається дивним. Він був розроблений для ефективного управління великими файлами. Я використовую його для колекцій фото / музики (тощо). Розробка git-annex дуже активна. Вміст файлів можна видалити з сховища Git, Git відстежує лише ієрархію дерев (через символьні посилання). Однак для отримання вмісту файлу необхідний другий крок після витягування / натискання, наприклад:

$ git annex add mybigfile
$ git commit -m'add mybigfile'
$ git push myremote
$ git annex copy --to myremote mybigfile ## This command copies the actual content to myremote
$ git annex drop mybigfile ## Remove content from local repo
...
$ git annex get mybigfile ## Retrieve the content
## or to specify the remote from which to get:
$ git annex copy --from myremote mybigfile

Доступно багато команд, на веб-сайті є чудова документація. Пакет доступний на Debian .


11
Ого! Підвищення для приголомшливості! Це реалізує ідею, яку я мав останнім часом, і багато іншого. Це написано в Haskell не менше. git-media - це, до речі, хороша альтернатива.
cdunn2001

33
Але, додаток не підтримує Windows. Що проблематично для розробників ігор.
AA Grapsas

7
Я чув, що Steam втрачає підтримку Windows і додає підтримку Linux ...;) серйозно, наскільки важко це зробити, щоб перенести це? Я думаю, що це міг зробити ваш середній розробник ігор.
Сем Уоткінс

4
@EstebanBrenes Справжній вимикач угод полягає в тому, що у звичайній конфігурації для символічних посилань Windows потрібні підвищені привілеї для створення.
Лорен Холст

4
Я щойно знайшов цю сторінку . У ньому написано, що зараз git annexвін доступний і в Windows . Якщо хтось коли-небудь перевіряв це в Windows, я хотів би почути про його досвід!
Kouichi C. Nakamura

49

Ще одне рішення з квітня 2015 року - Git Large File Storage (LFS) (від GitHub).

Він використовує git-lfs (див. Git-lfs.github.com ) і тестується на сервері, який його підтримує: lfs-test-server :
Ви можете зберігати метадані лише в git repo, а у великому файлі - в іншому місці.

https://cloud.githubusercontent.com/assets/1319791/7051226/c4570828-ddf4-11e4-87eb-8fc165e5ece4.gif


3
lfs-test-serverоголошено не для використання у виробництві. Насправді я працюю над виробничим сервером LFS ( github.com/artemkin/git-lfs-server ). Він працює, але вже працює, і ми тестуємо його всередині компанії.
Стаса

Чи можете ви перевірити попередні версії такого бінарного файлу за допомогою git lfs?
mucaho

1
@mucaho Вам слід: синтаксис перевірки git незмінний, і сценарій lfs smudge все ще повинен бути викликаний.
VonC

31

Погляньте на git bup, який є розширенням Git для розумного зберігання великих бінарних файлів у сховищі Git.

Ви хочете мати його як підмодуль, але вам не доведеться турбуватися про те, що сховище важко обробляється. Один із випадків використання зразків - це зберігання зображень VM в Git.

Насправді я не бачив кращих показників стиснення, але мої сховища не мають в них дійсно великих двійкових файлів.

Ваш пробіг може відрізнятися.


3
bup забезпечує зберігання (внутрішньо використовуючи архіви парності для надмірності та git для стиснення, дедупування та історії), але він не поширює git. git- annex - це розширення git, яке забезпечує резервний пристрій зберігання файлів .
Тобу

@Tobu, коли я опублікував це, ще не існувало додатка до git (у основних версіях)
вересня 1212

2
bup, безумовно, цікавий для управління великими файлами. Я хотів би вказати на різницю в інтерфейсі: ви використовуєте команди bup поза будь-яким контекстом сховища, а git - це деталь реалізації.
Тобу

27

Також можна використовувати жир-жир . Мені подобається, що це залежить тільки від запасу Python і rsync. Він також підтримує звичайний робочий процес Git із наступними пояснювальними командами:

git fat init
git fat push
git fat pull

Крім того, вам потрібно зареєструвати файл .gitfat у вашому сховищі та змінити .gitattributes, щоб вказати розширення файлів, якими ви хочете git fatкерувати.

Ви додаєте двійковий код за допомогою звичайного git add, який, у свою чергу, викликає git fatна основі ваших правил gitattributes.

Нарешті, вона має перевагу в тому, що місце, де фактично зберігаються ваші бінарні файли, може ділитися між сховищами та користувачами та підтримує все, rsyncщо можна зробити.

ОНОВЛЕННЯ: Не використовуйте git-жир, якщо ви використовуєте міст Git-SVN. Це в кінцевому підсумку видалить двійкові файли з вашого сховища Subversion. Однак якщо ви використовуєте чистий сховище Git, воно працює чудово.


26

Я б використовував підмодулі (як Pat Notz) або два різних сховища. Якщо ви змінюєте свої бінарні файли занадто часто, то я намагаюся мінімізувати вплив величезного сховища, що очищає історію:

У мене була дуже схожа проблема кілька місяців тому: ~ 21 ГБ MP3-файлів, некласифікованих (невірні імена, невірні id3, не знаю, подобається мені цей MP3-файл чи ні ...), і реплікувався на трьох комп'ютерах.

Я використовував зовнішній жорсткий диск з основним сховищем Git і клонував його до кожного комп'ютера. Потім я почав класифікувати їх звичним способом (штовхати, тягнути, зливати ... видалення та перейменування багато разів).

Зрештою, у мене було лише ~ 6 ГБ MP3-файлів та ~ 83 ГБ у каталозі .git. Я використовував git-write-treeі git-commit-treeдля створення нового комітету, без предків, і розпочав нову гілку, яка вказує на це. "Журнал git" для цієї гілки показав лише один фіксатор.

Потім я видалив стару гілку, зберігав лише нову гілку, видалив журнали ref-журналів і запустив "git prune": після цього мої папки .git важили лише ~ 6 ГБ ...

Ви можете час від часу «очищати» величезний сховище однаково: Ваш «git clone» буде швидше.


Я щось подібне зробив колись, коли мені довелося розділити одне сховище, яке я випадково об'єднав у два різних. Хоча цікава схема використання. :)
пі.

1
Це буде те саме, що просто: rm -f .git; git init; git add. ; git commit -m "Сміття історії".
Пат Нотц

1
Так, це так само у моєму випадку у форматі mp3. Але іноді ви не хочете торкатися ваших гілок і тегів (не зменшуйте простір у загальнодоступних сховищах), але ви хочете пришвидшити "git-клон / отримання / витягнення" лише гілки (менше місця для виділеного для того, що - філійні сховища).
Даніель Фанджул

13

Я б хотів запропонувати рішення, засноване на осиротілих гілках та незначному зловживанні механізмом тегів, відтепер його називають * Двоєчне зберігання сиротинних тегів (OTABS)

TL; DR 12-01-2017 Якщо ви можете використовувати LFS github або будь-яку іншу сторону, будь-якими силами. Якщо ви не можете, то читайте далі. Попереджуйте, що це рішення є хакерським, і його слід розглядати як таке.

Бажані властивості OTABS

  • це чисте рішення лише для git та git - воно виконує цю роботу без будь-якого стороннього програмного забезпечення (наприклад, git-annex) або сторонньої інфраструктури (як LFS github).
  • він зберігає двійкові файли ефективно , тобто не розмиває історію вашого сховища.
  • git pullі git fetch, в тому числі git fetch --all, все ще ефективні пропускну здатність , тобто не всі великі двійкові файли витягуються з пульта за замовчуванням.
  • він працює в Windows .
  • він зберігає все в одному сховищі git .
  • вона дозволяє видалити застарілі бінарні файли (на відміну від bup).

Небажані властивості OTABS

  • це робить git cloneпотенційно неефективним (але не обов'язково, залежно від використання). Якщо ви розгорнете це рішення, можливо, вам доведеться порадити колегам використовувати його git clone -b master --single-branch <url>замість git clone. Це пояснюється тим, що git-клон за замовчуванням буквально клонує весь сховище, включаючи речі, на які ви зазвичай не хочете витрачати свою пропускну здатність, як, наприклад, невикористані комісії. Взято з SO 4811434 .
  • це робить git fetch <remote> --tagsпропускну здатність неефективною, але не обов'язково зберігання неефективною. Ви завжди можете порадити колегам не користуватися цим.
  • вам доведеться періодично використовувати git gcхитрість, щоб очистити сховище від файлів, які ви більше не хочете.
  • це не так ефективно, як bup або git-bigfiles . Але відповідно це більше підходить для того, що ви намагаєтеся зробити, і більше, ніж у продажу. Ви, мабуть, зіткнетеся з сотнями тисяч невеликих файлів або з файлами в діапазоні гігабайт, але читайте далі для вирішення проблем.

Додавання бінарних файлів

Перш ніж почати переконайтесь, що ви здійснили всі свої зміни, ваше робоче дерево оновлено, а ваш індекс не містить непогашених змін. Можливо, буде гарною ідеєю перенести всі локальні відділення на віддалений (github тощо) у випадку, якщо трапиться якась катастрофа.

  1. Створіть нове відділення сироти. git checkout --orphan binaryStuffзробить трюк. Це створює гілку, повністю від'єднану від будь-якої іншої гілки, і перше введення, яке ви зробите в цій гілці, не матиме жодного з батьків, що зробить її кореневою командою.
  2. Очистіть свій індекс за допомогою git rm --cached * .gitignore.
  3. Зробіть глибокий вдих і видаліть все робоче дерево за допомогою rm -fr * .gitignore. Внутрішній .gitкаталог залишатиметься недоторканим, оскільки *підстановка не відповідає йому.
  4. Скопіюйте у свій VeryBigBinary.exe або у ваш VeryHeavyDirectory /.
  5. Додайте його && зробити це.
  6. Тепер це стає складним - якщо ви запхнете його у пульт у якості гілки, всі ваші розробники завантажуватимуть його наступного разу, коли вони посилаються на git fetchзасмічення свого з'єднання. Ви можете уникнути цього, натиснувши тег замість гілки. Це все ще може вплинути на пропускну здатність та зберігання файлової системи вашого колеги, якщо вони мають звичку вводити текст git fetch <remote> --tags, але читайте далі для вирішення. Вперед іgit tag 1.0.0bin
  7. Надішліть свою тегу-сироту git push <remote> 1.0.0bin.
  8. Просто щоб ви ніколи не натискали свою бінарну гілку випадково, ви можете її видалити git branch -D binaryStuff. Ваша комісія не буде позначена для вивезення сміття, оскільки тег-сирота, що вказує на неї 1.0.0bin, достатній, щоб зберегти її в живих.

Перевірка бінарного файлу

  1. Як я (або мої колеги) перевіряють VeryBigBinary.exe у поточному робочому дереві? Якщо ваша робоча галузь, наприклад, майстер, ви можете просто git checkout 1.0.0bin -- VeryBigBinary.exe.
  2. Це не вдасться, якщо у вас немає 1.0.0binзавантаженого тегу-сироти , і в цьому випадку вам доведеться git fetch <remote> 1.0.0binзаздалегідь.
  3. Ви можете додати його VeryBigBinary.exeдо свого майстра .gitignore, щоб ніхто у вашій команді випадково не забруднив основну історію проекту бінарним файлом.

Повне видалення двійкового файлу

Якщо ви вирішили повністю очистити VeryBigBinary.exe з вашого локального сховища, віддаленого сховища та сховищ вашого колеги, ви можете просто:

  1. Видаліть тег-сироту на пульті git push <remote> :refs/tags/1.0.0bin
  2. Видаліть мітку-сирота локально (видаляє всі інші нерозділені теги) git tag -l | xargs git tag -d && git fetch --tags. Взято з SO 1841341 з незначною модифікацією.
  3. Використовуйте трюк git gc, щоб видалити невстановлену зараз локальну комісію. git -c gc.reflogExpire=0 -c gc.reflogExpireUnreachable=0 -c gc.rerereresolved=0 -c gc.rerereunresolved=0 -c gc.pruneExpire=now gc "$@". Він також видалить усі інші невирішені зобов'язання. Взято з SO 1904860
  4. Якщо можливо, повторіть трюк git gc на пульті. Це можливо, якщо ви самостійно розміщуєте свій сховище, і це може бути неможливо з деякими постачальниками git, наприклад, github або в деяких корпоративних середовищах. Якщо ви хостите з постачальником, який не дає вам ssh доступу до віддаленого, просто нехай це буде. Цілком можливо, що інфраструктура вашого постачальника очистить ваші нерозділені зобов’язання у власний солодкий час. Якщо ви знаходитесь у корпоративному середовищі, ви можете порадити своїм ІТ-інспекторам запускати сміттєві завдання, збираючи ваш пульт раз на тиждень. Незалежно від того, чи вони це роблять, чи ні, це не матиме жодного впливу на вашу команду з точки зору пропускної здатності та зберігання, якщо ви радите своїм колегам завжди git clone -b master --single-branch <url>замість цього git clone.
  5. Усі ваші колеги, які хочуть позбутися застарілих тегів-сиріт, повинні лише застосувати кроки 2-3.
  6. Потім можна повторити кроки 1-8 Додавання бінарних файлів, щоб створити новий тег-сирота 2.0.0bin. Якщо ви переживаєте за те, що ваші колеги вводять текст, git fetch <remote> --tagsви можете насправді назвати його знову 1.0.0bin. Це дозволить переконатися, що наступного разу, коли вони 1.0.0binотримають усі теги, старі не будуть відменені та позначені для подальшого вивезення сміття (з використанням кроку 3). Коли ви намагаєтеся перезаписати тег на пульт, вам слід користуватися -fтаким чином:git push -f <remote> <tagname>

Післямова

  • OTABS не торкається вашого головного чи будь-якого іншого вихідного коду / гілки розробки. Хеш-коміти, вся історія та невеликі розміри цих гілок не впливають. Якщо ви вже розсипали історію вихідного коду бінарними файлами, вам доведеться очистити її як окрему роботу. Цей сценарій може бути корисним.

  • Підтверджено для роботи в Windows з git-bash.

  • Для покращення зберігання бінарних файлів корисно застосувати набір стандартних трік . Частий запуск git gc(без додаткових аргументів) дозволяє git оптимізувати базове зберігання ваших файлів за допомогою двійкових дельт. Однак, якщо ваші файли навряд чи будуть схожі з фіксацією для фіксації, ви можете повністю вимкнути бінарні дельти. Крім того, оскільки немає сенсу стискати вже стиснуті або зашифровані файли, наприклад .zip, .jpg або .crypt, git дозволяє вимкнути стиснення базового сховища. На жаль, це параметр "майже або нічого", що впливає і на ваш вихідний код.

  • Ви можете скопіювати сценарії до частин OTABS для швидшого використання. Зокрема, сценарії кроків 2-3 із Повністю видалення бінарних файлів у updateгак git можуть дати вагому, але, можливо, небезпечну семантику для git fetch ("вилучити та видалити все, що застаріло").

  • Ви можете пропустити крок 4 Повністю видалених бінарних файлів, щоб зберегти повну історію всіх бінарних змін на пульті за рахунок центрального блоку сховища. Місцеві сховища з часом залишатимуться низькими.

  • У світі Java можна комбінувати це рішення з maven --offlineстворенням відтворюваної збірки в режимі офлайн, що зберігається повністю у вашому контролі версій (це легше з maven, ніж з gradle). У світі Golang можливо, щоб на цьому рішенні можна було керувати, а не керувати своїм GOPATH go get. У світі python можна поєднувати це з virtualenv для створення самостійного середовища розробки, не покладаючись на сервери PyPi для кожної збірки з нуля.

  • Якщо виконавчі файли змінюються дуже часто, як будують артефакти, це може бути гарною ідеєю для сценарію вирішення , яке зберігає 5 останніх версії артефактів в тегах безгоспних monday_bin, tuesday_bin, ..., friday_bin, а також сиріт теги для кожного випуску 1.7.8bin 2.0.0binтощо. Ви можете weekday_binщодня обертати та видаляти старі двійкові файли. Таким чином ви отримуєте найкраще з двох світів: ви зберігаєте всю історію свого вихідного коду, але лише відповідну історію ваших бінарних залежностей. Також дуже просто отримати бінарні файли для заданого тегу, не отримуючи весь вихідний код з усією його історією: git init && git remote add <name> <url> && git fetch <name> <tag>слід зробити це за вас.


"Ви повинні періодично використовувати git gc", - перестав читати прямо там. Чому хтось відмовиться від свого останнього ременя безпеки на користь якогось злому?
user1643723

@ user1643723 git gcне є небезпечним для запуску. Усі ваші зобов’язання, що звисають, будуть безпечно тримати на жорсткому диску принаймні 30 днів за замовчуванням: git-scm.com/docs/git-gc
Адам Куркевич

Дякуємо за детальну реєстрацію. Я хотів спробувати це як спосіб збереження деяких бінарних залежностей у моєму репортажі GitHub таким чином, що вони не завантажуються за замовчуванням, коли хтось закриває репо, але можуть бути завантажені вручну та оновити локальну репо. Однак я отримав помилку на цьому кроці: git push <remote> 1.0.0bin- remote: error: GH001: Large files detected. You may want to try Git Large File Storage. Схоже, можливо, GitHub вже не підтримує це? Розмір, про який йдеться, був розміром 100 Мб.
користувач5359531

1
Якщо бути чесним, якщо вам дозволяється використовувати github для вашої роботи, що заважає вам використовувати LFS? Хлопці з github доклали великих зусиль для створення цього продукту, і вони навіть розміщують його для вас, і їх інфраструктура оптимізована навколо його використання. Цей злом призначений для ситуацій, коли ви дійсно не можете використовувати LFS або інших сторонніх сторін, і ви шукаєте рішення з чистого ґіту.
Адам Куркевич

Я також оновив відповідь, щоб зрозуміти, наскільки насправді це рішення.
Адам Куркевич

13

На мою думку, якщо ви, ймовірно, часто змінюєте ці великі файли, або якщо ви збираєтеся зробити чимало git cloneабо git checkout, то вам варто серйозно розглянути можливість використання іншого сховища Git (або, можливо, іншого способу доступу до цих файлів).

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


13
І окремі репости не скоротять час оформлення каси, оскільки ви все ще повинні перевірити обидва репости!
Еміль Сидить

@EmilSit окреме репо може зробити касу набагато коротшою, якщо ви стабільно очищаєте історію "бінарного репо". Більше того, розробники не будуть змушені кожен раз перевіряти обидві репости .
FabienAndre

Чому б просто не отримати сценарій збірки основного модуля, щоб отримати бінарні файли з другого репо, витягуючи їх по одному (як тут: stackoverflow.com/questions/1125476/… ).
akauppi

1
Навіть якщо ваші бінарні файли не часто змінюються, великі файли все одно можуть вбивати ваш робочий процес, якщо ви часто натискаєте гілки до сховища для цілей співпраці.
Тімо Рейманн

9

SVN, здається, обробляє двійкові дельти ефективніше, ніж Git.

Мені довелося визначитися з системою версій документації (JPEG-файли, PDF-файли та .odt-файли). Я щойно тестував додавання JPEG-файлу та обертання його на 90 градусів чотири рази (щоб перевірити ефективність бінарних дельт). Сховище Git виросло на 400%. Склад SVN виріс лише на 11%.

Так виглядає, що SVN набагато ефективніше з бінарними файлами.

Тож мій вибір - Git для вихідного коду та SVN для бінарних файлів, таких як документація.


33
Вам просто потрібно було запустити "git gc" (переупаковка та збирання сміття) після додавання цих 4 файлів. Git не одразу стискає весь доданий вміст, щоб у вас було стиснення групи файлів (що є більш ефективним за розміром) і не буде уповільнення окремо стиснення кожного доданого об'єкта там. Але навіть без "git gc", git все-таки зробив би компресію для вас (все-таки після того, як помітив, що накопичилося достатньо розпакованих об'єктів).
соловей

24
@jpierson Я створив порожнє сховище git і додав (і поклав на нього) повністю біле bmp-зображення розміром 41 МБ, що призвело до загального сховища git розміром 328 КБ. Після git gcзагального розміру сховища git було зменшено до 184 КБ. Потім я змінив один піксель з білого на чорний і здійснив цю зміну, загальний розмір сховища git збільшився до 388 КБ, а після git gcрозміру загального сховища git було зменшено до 184 КБ. Це показує, що git досить хороший у стисканні та пошуку дельт двійкових файлів.
Tader

6
@jpierson Sidenote: Я щойно коментував бінарні дельти. Git з'їсть всю вашу пам’ять і обміняється, якщо він керує сховищами з великими файлами (розміром ГБ). Для цього використовуйте git-
annex

12
@JanDvorak - про це ніхто не згадував, бо це абсолютно неправда. Підривні копії дешеві - svnbook.red-bean.com/en/1.7/svn.branchmerge.using.html - приблизно в середині сторінки.
Joris Timmermans

12
@Tader: ваш тест поганий. Те, що ви називаєте двійковим файлом, насправді (з точки зору git) більше схоже на текстовий файл - бітовий потік вирівнюється за байтами, і там можуть бути зроблені значні, локалізовані відмінності; врешті-решт, зміна одного пікселя в основному еквівалентна зміні одного символу в текстовому файлі (а хто зараз використовує нестиснені растрові карти?) Спробуйте той же експеримент з невеликим відео, стислим зображенням, віртуальною машиною, zipfile чи будь-яким іншим - і ви знайдете що git не справляється ефективно з дельтою; насправді це неможливо з несприйнятливими даними.
Еймон Нербонна

4

git clone --filter з Git 2.19 + дрібні клони

Ця нова опція може в кінцевому підсумку стати остаточним рішенням проблеми бінарних файлів, якщо Git та GitHub розробити і зробити її достатньо зручною для користувача (чого, напевно, досі не досягнуто для підмодулів ).

Він дозволяє фактично отримувати лише потрібні файли та каталоги для сервера, а також був представлений разом із віддаленим розширенням протоколу.

З цим ми могли б спершу зробити дрібний клон, а потім автоматизувати, які краплі отримують за допомогою системи збирання для кожного типу збірки.

Навіть вже є такий, --filter=blob:limit<size>що дозволяє обмежити максимальний розмір краплі для отримання.

Я надав мінімально детальний приклад того, як виглядає ця функція: Як я клоную підкаталог лише у сховищі Git?


2

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

Я особисто зіткнувся з помилками синхронізації з Git з деякими моїми хмарними хостами, коли мої веб-додатки двійкові дані надрізали вище позначки 3 ГБ . Тоді я розглядав BFT Repo Cleaner , але це відчувало, як зламати. З того часу я почав просто зберігати файли поза межами програми Git, замість цього використовуючи спеціально створені інструменти, такі як Amazon S3 для управління файлами, версій та резервного копіювання.

Хтось має досвід роботи з декількома сховищами Git та керуванням ними в одному проекті?

Так. Теми Гюго в основному керуються таким чином. Це трохи нерозумно, але це робить роботу.


Моя пропозиція - вибрати правильний інструмент для роботи . Якщо це компанія, а ви керуєте кодовою шкалою на GitHub, сплачуйте гроші та використовуйте Git-LFS. В іншому випадку ви можете вивчити більш креативні варіанти, такі як децентралізоване, зашифроване зберігання файлів за допомогою blockchain .

Додаткові варіанти, які слід врахувати, включають Minio та s3cmd .


0

Погляньте на камлістор . Це насправді не на основі Git, але я вважаю, що це більше підходить для того, що вам потрібно зробити.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.