Я створив інструмент python, який може це зробити. Я зробив це, тому що я спробував підхід @Thomas Luzat як у власному, так і в реальному виконанні @Johannes Ernst, і використаний простір удвічі збільшився з 20 ГБ до 40 Гб в процедурі клонування. Я думав, що потрібно щось більш ефективне.
Розглянемо цю загальну історію файлової системи:
current ---------------------------------\
| | | |
snap4 snap3 snap2 snap1
За алгоритмом Томаса "струм" буде клонований спочатку, і всі знімки (будучи знімками колишніх станів "поточного") використовуватимуть "поточний" як джерело / батьківський клон. Очевидно, було б краще базувати snap3 на snap4, snap2 на snap3 тощо.
І це лише верхівка айсберга; пошук "кращих" джерел клонування (з точки зору економії місця) у файловій системі btrfs зі складною історією - нетривіальна проблема. Я придумав три інші стратегії вирішення цієї проблеми, які, здається, використовують місце набагато ефективніше. Один насправді призвів до того, що розміри клонів трохи нижче розміру джерела.
Ви можете прочитати деталі на сторінці github, якщо вас цікавить.