如何在 Linux 中创建文件夹的“更改时复制”副本?

如何在 Linux 中创建文件夹的“更改时复制”副本?

我有一套用于构建大型项目的工具。在几个高级阶段,我的工具会创建构建环境(目录)的副本,以允许用户回滚到该点。

我正在尝试加快这个复制操作(空间不是大问题,但时间是大问题),所以我想找到一种方法来创建构建目录的副本,该副本完全由指向原始文件的链接(软链接、硬链接或类似链接)组成,但永远不会修改原始文件,而是在它们被(或可能)更改时自动创建它们的副本。

注意:这些工具用于进行构建,因此附属文件的生命周期很短,不需要长时间保存,并且总是可以以时间为代价从原始代码重新创建,所以我没有考虑过像 Subversion 这样的 SCM 解决方案。

答案1

单片机用于此目的:

  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

相关内容