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

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

Примечание: эти инструменты предназначены для сборки, поэтому сопутствующие файлы будут иметь короткое время жизни, их не нужно будет долго хранить, и их всегда можно будет воссоздать из исходного кода ценой времени, поэтому я не был учитывая SCM-решения, такие как Subversion.

1 ответ1

2

SCM может использоваться для этого:

  1. Создайте репозиторий с помощью всего одного коммита:

    git init
    git add .
    git commit -m "initial commit"
    
  2. строить

  3. Возврат к исходному состоянию

    git checkout -f   # discard modifications to committed files
    git clean -f -d   # delete files that were not committed
    

Для реального копирования при записи вам потребуется поддержка на уровне файловой системы. zfs позволяет создавать снимки для каждой файловой системы (и дешево создать отдельную файловую систему zfs только для корня сборки); в btrfs то же самое делается через подтомы. Кроме того, в btrfs у вас есть новый тип ссылок, называемый "reflinks", которые похожи на жесткие ссылки, но с CoW.

btrfs subvolume create ~/build.base
[fill ~/build.base]
btrfs subvolume snapshot ~/build.base ~/build.temp
[run build in ~/build.temp]
btrfs subvolume delete ~/build.temp

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .