在ubuntu 7。04下配置SVN的自动脚本,如果你除了命令本身外,懒得敲任何输入(超级自动化?),那么你页可以用到它:)我也懒得说了,RTFC:
#
!/bin/bash
#----------------------------------------------------------------------mutating prepare section line[1:10]
exe0path = `dirname " $0 " ` &&
sed - n ' 1p;10,$p ' " $0 " > " $0.vv " &&
chmod + x " $0.vv " || (rm $ 0 . vv ; echo " mutating exectuion fail!!! " ; exit 20 )
yes | sed ' s/y/n/ ' | " $0.vv " ; exit
# ----------------------------------------------------------------------------------mutating execution start
#if [ $# -lt 1 ] ;then
# echo "usage: `basename $0` <wc> 将工作空间导入该用户的SVN仓库"
# echo '* 访问地址 1:svn://ip/sourceforge.net/"$(basename "$wc")"'
# echo '* 访问地址 2:http://ip/sourceforge.net/"$(basename "$wc")"'
# exit
#fi
# local环境
sudo apt - get - y install subversion 1 >/ dev / null
# 默认的SVN服务器根目录设置在~/svnroot,不影响项目仓库的路径,但是必须位于该路径以下
SVNROOT = " $HOME/svnroot "
[ ! - e " $SVNROOT " ] && mkdir " $SVNROOT "
echo " SVNROOT=$SVNROOT "
# 开启SVN服务器,指定可访问范围
killall svnserve 2 >/ dev / null; sleep 0 . 0005s # 系统动作,耗时 < 0.001 sec
svnserve - d - r " $SVNROOT " -- listen - host `ifconfig eth0 | awk ' /inet/ {split($2,x,":");print x[2]} ' ` && echo " SVN server started on LAN ... " || (echo " repo exist!!! " ; read )
# 这里监听主机名只能设置一个,最好设成本机的LAN IP/hostname
# 开启防火墙端口
sudo / sbin / iptables - A INPUT - i eth0 - p tcp -- dport 3690 - j ACCEPT
echo - n " root " ; su - c " /sbin/iptables-save > /etc/iptables.save "
# 此处似乎有一处bug:当用yes|sed 's/y/nn' | `basename $0` $1这样的方式回避 su 要求的root口令时,nn随便是什么都可以!!??
# 默认使用 sourceforge.net仓库
repo = " $SVNROOT/sourceforge.net "
[ ! - e " $repo " ] && svnadmin create " $repo " || (echo " repo exist!!! " ; read )
# ################################################################### 配置仓库权限
# LAN 环境
# 设置用户名-密码
cat > " $repo/conf/passwd " << EOF
[users]
svnadmin = svnadmin
ubuntu = a
duanfeilei =
chenjunwen =
EOF
cat > " $repo/conf/svnserve.conf " << EOF
[general]
anon - access = none
auth - access = write
password - db = passwd
authz - db = authz
realm = sourceforge . net Repository
EOF
# 访问路径与用户关联
cat > " $repo/conf/authz " << EOF
[groups]
admin = svnadmin , ubuntu
coder = duanfeilei , chenjunwen
[sourceforge . net :/ ]
@admin = rw
* = r
[sourceforge . net :/ pub]
* = rw
[sourceforge . net :/ fgen]
@coder = rw
* =
EOF
if false ;then
# Apache环境
#################################################################### 以上必须使用路径,本地操作!
sudo apt - get - y install apache2 subversion libapache2 - svn 1 >/ dev / null
sudo a2enmod dav dav_svn
sudo cp - i / etc / apache2 / mods - available / dav_svn . conf / etc / apache2 / mods - available / dav_svn . conf . bak
cat > dav_svn . conf << EOF
< Location / svn >
DAV svn
SVNPath / home / ubuntu / svnroot
AuthzSVNAccessFile / home / ubuntu / svnroot / sourceforge . net / conf / authz // 权限配置文件
AuthType Basic // 连接类型设置
AuthName " Subversion.zoneyump " // 连接框提示
AuthUserFile // 用户配置文件
< LimitExcept GET PROPFIND OPTIONS REPORT >
Require valid - user
</ LimitExcept >
</ Location >
EOF
sudo mv - i dav_svn . conf / etc / apache2 / mods - available / dav_svn . conf
fi
# ########################################################################## 将工作空间导入
[ - z $ 1 ] && wc = $(pwd) || wc = $ 1
# 用 svnadmin 导入
echo " importing ... "
! svn import - m " hello, first step " " $wc " svn :// `ifconfig eth0 | awk ' /inet/ {split($2,x,":");print x[2]} ' ` / sourceforge . net / " $(basename " $wc " ) " -- username svnadmin -- password svnadmin && read
# 这里必须填写注释这一参数,且-m后有空格。导入的工作空间必须使用URL地址(file://协议也是一种,用于本地访问)
# 测试并报告是否成功
bbb = $(pwd)
cd " $wc "
rm - rf svntest
[ ! - e svntest ] && mkdir svntest
echo " checkouting ... "
! svn checkout svn :// `ifconfig eth0 | awk ' /inet/ {split($2,x,":");print x[2]} ' ` / sourceforge . net / " $(basename " $wc " ) " svntest -- username = chenjunwen -- password = && read
a = `find . - type f | head - n1`
b = `find . - type f | tail - n1`
cat $a > $b
echo " commiting ... "
# ! svn commit -m "first commit" svntest && read
cd " $bbb "
# 另外,注意使用esvn时,上一次的认证用户信息会被缓存,因此只要正确使用一次即可。
rm " $0 " 1 >/ dev / null 2 >& 1 # for self-mutating , don't
#----------------------------------------------------------------------mutating prepare section line[1:10]
exe0path = `dirname " $0 " ` &&
sed - n ' 1p;10,$p ' " $0 " > " $0.vv " &&
chmod + x " $0.vv " || (rm $ 0 . vv ; echo " mutating exectuion fail!!! " ; exit 20 )
yes | sed ' s/y/n/ ' | " $0.vv " ; exit
# ----------------------------------------------------------------------------------mutating execution start
#if [ $# -lt 1 ] ;then
# echo "usage: `basename $0` <wc> 将工作空间导入该用户的SVN仓库"
# echo '* 访问地址 1:svn://ip/sourceforge.net/"$(basename "$wc")"'
# echo '* 访问地址 2:http://ip/sourceforge.net/"$(basename "$wc")"'
# exit
#fi
# local环境
sudo apt - get - y install subversion 1 >/ dev / null
# 默认的SVN服务器根目录设置在~/svnroot,不影响项目仓库的路径,但是必须位于该路径以下
SVNROOT = " $HOME/svnroot "
[ ! - e " $SVNROOT " ] && mkdir " $SVNROOT "
echo " SVNROOT=$SVNROOT "
# 开启SVN服务器,指定可访问范围
killall svnserve 2 >/ dev / null; sleep 0 . 0005s # 系统动作,耗时 < 0.001 sec
svnserve - d - r " $SVNROOT " -- listen - host `ifconfig eth0 | awk ' /inet/ {split($2,x,":");print x[2]} ' ` && echo " SVN server started on LAN ... " || (echo " repo exist!!! " ; read )
# 这里监听主机名只能设置一个,最好设成本机的LAN IP/hostname
# 开启防火墙端口
sudo / sbin / iptables - A INPUT - i eth0 - p tcp -- dport 3690 - j ACCEPT
echo - n " root " ; su - c " /sbin/iptables-save > /etc/iptables.save "
# 此处似乎有一处bug:当用yes|sed 's/y/nn' | `basename $0` $1这样的方式回避 su 要求的root口令时,nn随便是什么都可以!!??
# 默认使用 sourceforge.net仓库
repo = " $SVNROOT/sourceforge.net "
[ ! - e " $repo " ] && svnadmin create " $repo " || (echo " repo exist!!! " ; read )
# ################################################################### 配置仓库权限
# LAN 环境
# 设置用户名-密码
cat > " $repo/conf/passwd " << EOF
[users]
svnadmin = svnadmin
ubuntu = a
duanfeilei =
chenjunwen =
EOF
cat > " $repo/conf/svnserve.conf " << EOF
[general]
anon - access = none
auth - access = write
password - db = passwd
authz - db = authz
realm = sourceforge . net Repository
EOF
# 访问路径与用户关联
cat > " $repo/conf/authz " << EOF
[groups]
admin = svnadmin , ubuntu
coder = duanfeilei , chenjunwen
[sourceforge . net :/ ]
@admin = rw
* = r
[sourceforge . net :/ pub]
* = rw
[sourceforge . net :/ fgen]
@coder = rw
* =
EOF
if false ;then
# Apache环境
#################################################################### 以上必须使用路径,本地操作!
sudo apt - get - y install apache2 subversion libapache2 - svn 1 >/ dev / null
sudo a2enmod dav dav_svn
sudo cp - i / etc / apache2 / mods - available / dav_svn . conf / etc / apache2 / mods - available / dav_svn . conf . bak
cat > dav_svn . conf << EOF
< Location / svn >
DAV svn
SVNPath / home / ubuntu / svnroot
AuthzSVNAccessFile / home / ubuntu / svnroot / sourceforge . net / conf / authz // 权限配置文件
AuthType Basic // 连接类型设置
AuthName " Subversion.zoneyump " // 连接框提示
AuthUserFile // 用户配置文件
< LimitExcept GET PROPFIND OPTIONS REPORT >
Require valid - user
</ LimitExcept >
</ Location >
EOF
sudo mv - i dav_svn . conf / etc / apache2 / mods - available / dav_svn . conf
fi
# ########################################################################## 将工作空间导入
[ - z $ 1 ] && wc = $(pwd) || wc = $ 1
# 用 svnadmin 导入
echo " importing ... "
! svn import - m " hello, first step " " $wc " svn :// `ifconfig eth0 | awk ' /inet/ {split($2,x,":");print x[2]} ' ` / sourceforge . net / " $(basename " $wc " ) " -- username svnadmin -- password svnadmin && read
# 这里必须填写注释这一参数,且-m后有空格。导入的工作空间必须使用URL地址(file://协议也是一种,用于本地访问)
# 测试并报告是否成功
bbb = $(pwd)
cd " $wc "
rm - rf svntest
[ ! - e svntest ] && mkdir svntest
echo " checkouting ... "
! svn checkout svn :// `ifconfig eth0 | awk ' /inet/ {split($2,x,":");print x[2]} ' ` / sourceforge . net / " $(basename " $wc " ) " svntest -- username = chenjunwen -- password = && read
a = `find . - type f | head - n1`
b = `find . - type f | tail - n1`
cat $a > $b
echo " commiting ... "
# ! svn commit -m "first commit" svntest && read
cd " $bbb "
# 另外,注意使用esvn时,上一次的认证用户信息会被缓存,因此只要正确使用一次即可。
rm " $0 " 1 >/ dev / null 2 >& 1 # for self-mutating , don't
2007/10/11:
上面的脚本很混乱,实际中,可以采用下面的经过“包装”的svn:
#
!/bin/bash
fullpath() # 可以将任意系统中存在的路径转换为绝对路径
{
if [ - z $ 1 ] ;then
echo " Usage: `basename $0` <path> "
exit
fi
if [ $ 1 = " --help " ];then
echo " 功能:对于给出的文件或文件夹的,路径或相对路径,转换为绝对路径 "
exit
fi
if [ ! - e " $1 " ];then
echo " path not exisit!!! "
exit
fi
path = $ 1
pwddir = `pwd` # 总是表示 path 上层的目录,绝对路径形式
pwddir = ${pwddir %/ }
[ - d " $path " ] && path = " ${path%/}/ " # 确保目录不被当作文件处理
# 处理头部
dir = `echo $path | awk - F " / " ' {print $1} ' `
case $dir in
" . " ) path = ${path # ./}
;;
" .. " ) path = ${path # ../}
pwddir = ${pwddir %/* }
;;
"" ) path = ${path # /}
pwddir =
;;
* )
;;
esac
while [ ! - z " $path " ]; do
if [ " ${path#../} " != " ${path} " ];then
path = ${path # ../}
pwddir = ${pwddir %/* }
else
pwddir = " ${pwddir}/${path%%/*} "
path = ${path # */}
fi
done
}
pwddir =
if [ - z $ 1 ];then
echo ""
exit
fi
case $ 1 in
" create " ) case $ # in
1 ) repo =.
;;
2 ) repo = $ 2
;;
esac
svnadmin create $repo
;;
" start " ) if [ - z $ 2 ];then
echo ""
exit
fi
fullpath $ 2
svnserve - d - r file :// " $pwddir "
;;
" stop " ) if [ - z $ 2 ];then
echo ""
exit
fi
fullpath $ 2
killall svnserve
;;
" import " ) case $ # in
1 ) echo ""
exit
;;
2 ) wc =.
repo = $ 2
;;
3 ) wc = $ 2
repo = $ 3
;;
esac
[ ! - e " $repo " ] && mkdir " $repo "
fullpath $repo
svn import $wc file :// " $pwddir "
;;
" checkin " ) case $ # in
1 ) echo ""
exit
;;
2 ) wc =.
repo = $ 2
;;
3 ) wc = $ 2
repo = $ 3
;;
esac
fullpath $repo
svn ci $wc file :// " pwddir "
;;
" checkout " ) case $ # in
1 ) echo ""
exit
;;
2 ) wc =.
repo = $ 2
;;
3 ) wc = $ 2
repo = $ 3
;;
esac
fullpath $repo
svn co $wc file :// " pwddir "
;;
* ) echo " undefined command "
exit
;;
esac
unset pwddir
fullpath() # 可以将任意系统中存在的路径转换为绝对路径
{
if [ - z $ 1 ] ;then
echo " Usage: `basename $0` <path> "
exit
fi
if [ $ 1 = " --help " ];then
echo " 功能:对于给出的文件或文件夹的,路径或相对路径,转换为绝对路径 "
exit
fi
if [ ! - e " $1 " ];then
echo " path not exisit!!! "
exit
fi
path = $ 1
pwddir = `pwd` # 总是表示 path 上层的目录,绝对路径形式
pwddir = ${pwddir %/ }
[ - d " $path " ] && path = " ${path%/}/ " # 确保目录不被当作文件处理
# 处理头部
dir = `echo $path | awk - F " / " ' {print $1} ' `
case $dir in
" . " ) path = ${path # ./}
;;
" .. " ) path = ${path # ../}
pwddir = ${pwddir %/* }
;;
"" ) path = ${path # /}
pwddir =
;;
* )
;;
esac
while [ ! - z " $path " ]; do
if [ " ${path#../} " != " ${path} " ];then
path = ${path # ../}
pwddir = ${pwddir %/* }
else
pwddir = " ${pwddir}/${path%%/*} "
path = ${path # */}
fi
done
}
pwddir =
if [ - z $ 1 ];then
echo ""
exit
fi
case $ 1 in
" create " ) case $ # in
1 ) repo =.
;;
2 ) repo = $ 2
;;
esac
svnadmin create $repo
;;
" start " ) if [ - z $ 2 ];then
echo ""
exit
fi
fullpath $ 2
svnserve - d - r file :// " $pwddir "
;;
" stop " ) if [ - z $ 2 ];then
echo ""
exit
fi
fullpath $ 2
killall svnserve
;;
" import " ) case $ # in
1 ) echo ""
exit
;;
2 ) wc =.
repo = $ 2
;;
3 ) wc = $ 2
repo = $ 3
;;
esac
[ ! - e " $repo " ] && mkdir " $repo "
fullpath $repo
svn import $wc file :// " $pwddir "
;;
" checkin " ) case $ # in
1 ) echo ""
exit
;;
2 ) wc =.
repo = $ 2
;;
3 ) wc = $ 2
repo = $ 3
;;
esac
fullpath $repo
svn ci $wc file :// " pwddir "
;;
" checkout " ) case $ # in
1 ) echo ""
exit
;;
2 ) wc =.
repo = $ 2
;;
3 ) wc = $ 2
repo = $ 3
;;
esac
fullpath $repo
svn co $wc file :// " pwddir "
;;
* ) echo " undefined command "
exit
;;
esac
unset pwddir