Оптимізуйте git repo, що містить великі бінарні файли


21

Наш проект становить близько 11 ГБ, 10 з яких - це двійкові дані (.png зображення). Отже, git diffабо git statusоперації займають більше хвилини. На щастя, всі файли даних розділені в папку з чудовою назвою data. Завдання - "Уникайте стискання, різної та інших дорогих операцій над бінарними файлами".

  • Було розцінено поділ проекту на два репости. Тоді dataбуде зовнішнє репо, яке перевіряється основним вихідним кодом repo. Було вирішено, що витрата на синхронізацію репостів буде занадто великою, особливо для виконавців, які працюють з файлами даних.

  • Явно говорячи, що ці файли git є бінарними , виключаються файли з diff , але вони здаються лише частковим вирішенням питання.

Я відчуваю, що атрибути git - це рішення, але як? Або є краща архітектура, ніж монолітне репо?


1
Перше велике питання тут - наскільки важливі ці файли даних. Чи потрібні вашій програмі всі доступні зображення для того, щоб зробити щось корисне, чи вона може відмовитися від невеликого підмножини під час типової розробки / тестування?
Іксрек

@Ixrec, зображення насправді важливіші за вихідний код. Усі вони повинні бути присутніми, а контрольні суми .png завжди перевіряються на наявність пошкоджених файлів.
Vorac

1
Чому це питання не переповнюється стеком? Здається, що саме їй підходить.
спір

@spirc це питання простежує межу між "довідкою з програмним інструментом", яка знаходиться в режимі SO, і "стратегією управління версіями", яка тут є темою. Оскільки це не запитуйте, яку команду git виконувати, щоб зробити щось, явно не на стороні ТА, і я проголосував за те, щоб залишити її відкритою тут.

@Snowman дякую за відповідь. До якого пункту списку тем належить це? programmers.stackexchange.com/help/on-topic
spirc

Відповіді:


18

Можна використовувати git-lfs або подібні інструменти (git-fat, git- annex тощо). Ці інструменти в основному замінюють бінарні файли у вашій репо-файлі невеликим текстовим файлом хешами, а фактичні бінарні дані зберігають не-git-способом - як мережевий спільний доступ.

Робиться різним, і все надшвидко, оскільки лише хеші порівнюються, і є - принаймні для git-lfs - прозорими для користувача (після установки один раз).

Afaik git-lfs підтримується github, gitlab, VisualStudio та є відкритим кодом.


2
Чи спробували ви використати git-lfsдля проекту з великою кількістю гігабайт активів разом зі змішаною командою розробників / виконавців? Мені цікаво знати, чи люди використовують git-lfs для таких проектів, як ігри та анімація. З моменту написання його все ще досить новим. З мого власного досвіду, бар'єр для доступу до git для менш технічних користувачів вже дуже високий, тому мати додатковий шар для управління файлами над ним - людям може бути важко користуватися, якщо їм вже не зручно з git.
ideaman42

Вибачте, лише до приблизно 1 Гб даних. Але git-lfs не повинен додавати додаткових кроків для кінцевих користувачів, він повинен бути повністю прозорим.
kat0r

Це здається правильною відповіддю, якщо під час інтеграції виникнуть якісь проблеми, я звітну тут. Тож процедуру установки потрібно завершити лише один раз на сервері, а не на кожній клієнтській машині?
Vorac

Afaik вам також потрібно встановити невеликий клієнтський додаток, також перевірте сторінку github. Але це може бути легко розгорнути за допомогою групової політики / простішою за будь-яку альтернативу.
kat0r

1

Використовуйте як GIT, так і SVN repos

Якщо бінарні файли можна логічно відокремити від джерела, ви можете розглянути можливість використання git для текстових файлів та не DVCS, такий як підрив для двійкових файлів.

Проект, над яким я працюю, робить це, оскільки у нас є багато ГБ для складених бібліотек (для залежностей від OSX / Win32), які нам потрібно тримати у версії.


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

Використовувати SVN (з git svn)

Хоча цей компроміс не завжди такий приємний для розробників, які звикли використовувати звичайні git, ви можете використовувати SVN для основного сховища, а розробники можуть використовувати git svnінструменти.

Це робить трохи більше роботи для розробників, що використовують git, але означає для всіх, хто не знайомий з DVCS (або VCS взагалі) - вони можуть використовувати просту модель SVN без використання декількох складних систем управління версіями.


git-lfs також є варіантом, але я не використовував його, тому не можу говорити про те, наскільки добре він працює.

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