我有一个目录,其文件在自动化过程中可能每天都会更改,也可能不会更改。该目录包含一堆oracle Warehouse builder mdl文件,它们代表各个映射。自动oracle进程根据oracle模块中存在的映射创建mdl文件。在oracle进程运行之前,无法知道目录将包含哪些文件。
我需要在进程填充文件夹后将目录中的所有文件提交到subversion。如果昨天存在的文件已经消失(因为oracle映射不再存在),那么该文件也应该从svn中删除。如果在oracle中创建了新映射,因此已将新文件添加到该文件夹,则应将新文件添加到svn。如果映射已更改并且因此修改了新文件,则应将修改提交到svn。
所有这些都需要作为自动化过程的一部分发生,因此必须使用svn命令行指令将文件夹更改与svn同步。
是否有一个简单的svn命令(或命令序列)将使用svn repo同步文件夹而不是文件?
答案 0 :(得分:2)
假设我们有一个像这样的文件夹树:
.
├── autocommit.sh
├── dailysnapshot/
└── workingcopy/
dailysnapshot /存储每天刷新的mdl文件。 workingcopy /是您的subversion存储库的工作副本 请注意,此脚本只能提交工作副本下1级的更改,如果工作副本中有子文件夹,则需要改进脚本。
创建一个计划的crontab,以便调用autocommit.sh
用法:
autocommit.sh [snapshot dir] [working dir] [svn username] [svn password]
autocommit.sh来源:
#!/bin/bash
SNAPSHOT=`cd $1;pwd`
WORKINGDIR=`cd $2;pwd`
USERNAME="$3"
PASSWORD="$4"
function CheckModifiedAndNew() {
cd $1
for f in $(find .)
do
if [ -a $f ]; then
f=${f:2}
if [[ -n $f ]]; then
SnapshotFile="$1/$f"
WorkingFile="$2/$f"
if [[ -f $WorkingFile ]];then
if cmp $SnapshotFile $WorkingFile &> /dev/null; then
# 2 files are identical
echo &> /dev/null "" #do nothing here
else
echo "[Modified] $WorkingFile"
cp -f $SnapshotFile $WorkingFile
fi
else
cp -f $SnapshotFile $WorkingFile
echo "[Added] $WorkingFile"
svn add $WorkingFile
fi
fi
fi
done
}
function CheckRemove() {
cd $2
for f in $(find .)
do
if [ -a $f ]; then
f=${f:2}
if [[ -n $f ]]; then
SnapshotFile="$1/$f"
WorkingFile="$2/$f"
if [[ -f $SnapshotFile ]];then
echo &> /dev/null "" #do nothing here
else
echo "[Removed] $WorkingFile"
svn remove $WorkingFile
fi
fi
fi
done
}
function CommitAllChanges() {
cd $1
svn commit . --message="daily auto commit" --username=$USERNAME \
--password=$PASSWORD \
--non-interactive \
--no-auth-cache
}
CheckModifiedAndNew $SNAPSHOT $WORKINGDIR
CheckRemove $SNAPSHOT $WORKINGDIR
CommitAllChanges $WORKINGDIR
自定义以使其适合您的问题。
答案 1 :(得分:1)
没有简单的解决方案。但是,这是一项可以通过脚本完成的任务(例如使用bash)。
这个想法是你有一个导出目录(从oracle导出mdl文件的位置)和你的svn工作副本在不同的目录中。更新需要两个步骤:
完成此操作后,您将提交这些更改( svn commit )。在脚本中实现这一点并不难。
答案 2 :(得分:1)
您可以尝试WebDav and autoversioning - 即通过“网络共享”公开的subversion repo。写入和新文件将被添加到存储库中,我不确定删除是否也会被处理,但是期望它似乎不太现实。
WebDAV存在一些你应该注意的问题:它有点繁琐,它不会一次性提交所有文件(因为每个文件都会单独写),但你可能会得到足够的结果。
另一种方法是以大致相同的方式公开repo的文件系统驱动程序。