我正在寻找一种机制(在 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
此技术利用了git
和incron
。对于此方法,您需要执行以下操作:
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"
要么定期检查您的目录 - 或者如果您的编辑器可以编写脚本,请在保存后调用。
但是如果您这样做,排除大文件和一些“无用”的文件(如自动保存)可能会很有意义。