文件更改时自动进行版本控制(修改/创建/删除)

文件更改时自动进行版本控制(修改/创建/删除)

我正在寻找一种机制(在 Linux 上),该机制可以自动且透明地对目录中的任何更改进行版本控制(递归)。这旨在作为标准版本控制(SVN、git、...)的补充(如果所有请求的功能都可用,则可能是替代)

MS Windows 上具有此功能的产品是奥特维(以便更好地了解需求)。我很想有类似的东西,但针对非图形环境中的 Linux。

我看到有人尝试在 Linux 上实现此功能,我找到的最接近的一个是Subversion 上的自动版本控制但在现有环境(例如,配置文件在本地的服务器)上实现并不明显。

也许有可以合作的事情inotify

答案1

1. 使用 bazaar 和 inotify 的通用方法

我没有测试过,但我发现这篇文章它利用bzr(bazaar) &inotifywait来监视目录并使用 bazaar 对其中的文件进行版本控制。

此脚本完成监视目录更改的所有工作:

#!/bin/bash

# go to checkout repository folder you want to watch
cd path/to/www/parent/www
# start watching the directory for changes recusively, ignoring .bzr dir
# comment is made out of dir/filename
# no output is shown from this, but wrinting a filename instead of /dev/null 
# would allow logging
inotifywait –exclude \.bzr -r -q -m -e CLOSE_WRITE \
    –format=”bzr commit -m ‘autocommit for %w/%f’” ./ | \
    sh  2>/dev/null 1>&2 &
# disown the pid, so the inotify thread will get free from parent process
# and will not be terminated with it
PID=`ps aux | grep inotify | grep CLOSE_WRITE | grep -v grep | awk ‘{print $2}’`
disown $PID

# this is for new files, not modifications, optional
inotifywait –exclude \.bzr -r -q -m -e CREATE \
    –format=”bzr add *; bzr commit -m ‘new file added %w/%f’” ./ | \
    sh  2>/dev/null 1>&2 &
PID=`ps aux | grep inotify | grep CREATE | grep -v grep | awk ‘{print $2}’`
disown $PID

exit 0;

2. 管理 /etc

对于管理系统/etc目录的特殊情况,你可以使用该应用程序etckeeper

etckeeper 是一组工具,用于将 /etc 存储在 git、mercurial、darcs 或 bzr 存储库中。它与 apt(以及其他软件包管理器,包括 yum 和 pacman-g2)挂钩,以在软件包升级期间自动提交对 /etc 所做的更改。它跟踪修订控制系统通常不支持但对 /etc 很重要的文件元数据,例如 /etc/shadow 的权限。它非常模块化且可配置,如果您了解使用修订控制的基础知识,它也很容易使用。

这是一个很好的教程帮助您开始使用它。

3.使用 git 和 incron

此技术利用了gitincron。对于此方法,您需要执行以下操作:

A。创建一个仓库

% mkdir $HOME/git
% cd $HOME/git
% git init

B.创建$HOME/bin/git-autocommit脚本

#!/bin/bash

REP_DIR="$HOME/git"       # repository directory
NOTIFY_DIR="$HOME/srv"    # directory to version

cd $REP_DIR
GIT_WORK_TREE=$NOTIFY_DIR /usr/bin/git add .
GIT_WORK_TREE=$NOTIFY_DIR /usr/bin/git commit -a -m "auto"

C。向 incrontab 添加条目

% sudo incrontab -e $HOME/srv IN_MODIFY,IN_CREATE,IN_MOVED_FROM,IN_MOVED_TO $HOME/bin/git-autocommit

4.使用Flashbake

另一个选择是使用类似闪烤。Flashbake 是 Cory Doctorow(BoingBoing 名人)用来编写书籍的版本控制系统。

Flashbake 在底层使用 git 来跟踪变化,但它介于自动备份和自己使用普通版本控制系统之间。

Cory 希望该版本带有提示,即自动提交时他所在位置的快照以及他当时的想法。我快速草拟了一个 Python 脚本来提取他想要的上下文信息,并开始编写一个 shell 脚本来驱动 git,当 cron 作业调用 shell 包装器时,使用 Python 脚本的输出作为提交注释。

资源

答案2

立即虚拟文件系统想到了。它可以创建快照——而且有一些项目自动创建快照

答案3

我认为你的思路是对的inotify本文详细说明了它的基本用法,适用于与您类似的情况。我建议直接使用它,或者编译一个内核级实用程序,如文件系统变更。这有点麻烦,但您可以将变化检测绑定到git commit或类似的东西。

这两种解决方案都存在依赖第三方解决方案的问题。如果你不介意亲自动手,NodeJS提供了出色的跨平台功能(fs.watch) 就是为了这个目的。可以找到有关在 NodeJS 中监视文件更改的基本教程这里只需几十行甚至更少的代码,你就可以编写一个程序来监视目录中的文件,然后执行(通过子进程)并运行git commit或类似的(或者甚至手动增加版本文件索引,如果您喜欢自己动手的方法)。

fs.watch在 Linux 上由支持inotify,但使用起来更加直观。还有其他 NodeJS 项目以各种便利程度包装了文件监视功能,例如这个或者这个

答案4

这样的脚本并不难写。

我最喜欢的版本控制是 git。

下面的脚本应该可以做到这一点:

#!/bin/sh
git add .
git commit -am "my automatic commit"

要么定期检查您的目录 - 或者如果您的编辑器可以编写脚本,请在保存后调用。

但是如果您这样做,排除大文件和一些“无用”的文件(如自动保存)可能会很有意义。

相关内容