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

WoJ*_*WoJ 17 linux version-control versioning

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

在 MS Windows 上执行此操作的产品是AutoVer(以便更好地了解要求)。我很想拥有类似的东西,但针对非图形环境中的 Linux。

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

也许有什么用inotify

在此先感谢您的指点!沃杰

slm*_*slm 6

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;
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

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"
Run Code Online (Sandbox Code Playgroud)

C.在incrontab中添加一个条目

% sudo incrontab -e $HOME/srv IN_MODIFY,IN_CREATE,IN_MOVED_FROM,IN_MOVED_TO $HOME/bin/git-autocommit
Run Code Online (Sandbox Code Playgroud)

4. 使用 Flashbake

另一种选择是使用像Flashbake这样的工具。Flashbake 是 Cory Doctorow(BoingBoing 名人)用来写书的版本控制系统。

Flashbake 在幕后使用 git 来跟踪更改,但介于自动备份和自己使用普通版本控制系统之间。

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

资源

  • inotifywait+"git local"=gitwatch.sh,看这里:https://github.com/nevik/gitwatch/blob/master/gitwatch.sh (3认同)