AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 421703
Accepted
Jordan Reiter
Jordan Reiter
Asked: 2012-08-28 09:56:09 +0800 CST2012-08-28 09:56:09 +0800 CST 2012-08-28 09:56:09 +0800 CST

编写一个 SVN 钩子来更新已提交代码的副本

  • 772

我有一个 SVN 存储库,其中存储了很多子项目。现在在我post-commit的机器上,我只是循环遍历机器上所有可能的文件夹并svn update在每个文件夹上运行:

REPOS="$1"
REV="$2"
DIRS=("/path/to/local/copy/firstproject" "/path/to/local/copy/anotherproject" ... "/path/to/local/copy/spam")
LOGNAME=`/usr/bin/whoami`

for DIR in ${DIRS[@]}
do
    cd $DIR
    sudo /usr/bin/svn update --accept=postpone 2>&1 | logger
    logger "$LOGNAME Updated $DIR to revision $REV (from $REPOS) "
done

问题是,当我只是提交其中一个项目的子文件夹时,这是缓慢且多余的。我想知道是否有更好的方法来确定我应该使用哪个 DIRS 并只更新那个。

有什么办法可以做到这一点?据我所知,无法确定 repo 的哪一部分已提交,因此需要更新哪个目录。

为每个项目创建单独的存储库是唯一的选择吗?(可能应该从一开始就这样做,如果是这样......)

bash
  • 2 2 个回答
  • 523 Views

2 个回答

  • Voted
  1. Best Answer
    quanta
    2012-08-28T11:58:22+08:002012-08-28T11:58:22+08:00

    我想知道是否有更好的方法来确定我应该使用哪个 DIRS 并只更新那个。

    svnlook dirs-changed是你要找的:

    # svnlook dirs-changed -r 40270 /path/to/the/repo
    project1/foo/bar
    

    尝试这样的事情:

    #!/usr/local/bash4/bin/bash
    
    typeset -A IP
    typeset -A DOCROOT
    
    PROJECTS="project1 project2"
    
    IP=([project1]="ip1" [project2]="ip2")
    DOCROOT=([project1]="/var/www/html/project1/" [project2]="/var/www/html/project2/")
    
    REPO="$1"
    REV="$2"
    
    USER='deployer'
    
    PROJECT=`svnlook dirs-changed -r "$REV" "$REPO" | awk -F "/" '{ print $1 }'`
    
    ssh -t "$USER@${IP[$PROJECT]}" "cd ${DOCROOT[$PROJECT]} && svn up"
    
    • 5
  2. Jordan Reiter
    2012-08-29T06:07:56+08:002012-08-29T06:07:56+08:00

    根据 quanta 的帮助,这是我最终使用的脚本:

    REPO="$1"
    REV="$2"
    declare -A PROJECTS
    PROJECTS=(\
        [project1]="/path/to/projects/project1 /path/to/projects/project1-devel" \
        [project2]="/path/to/projects/project2 /path/to/projects/project2-devel" \
        [project3]="/path/to/projects/project3 /path/to/projects/project3-devel" \
    )
    
    PROJECT=`svnlook dirs-changed -r "$REV" "$REPO" | awk -F "/" '{ print $1 }'`
    DIRS=${PROJECTS[$PROJECT]}
    
    for DIR in $DIRS
    do
        cd $DIR
        sudo /usr/bin/svn update --accept=postpone 2>&1 | logger
        logger "$LOGNAME Updated $DIR to revision $REV (from $REPOS) "
    done
    

    请注意,我必须添加的一件大事是这declare -A PROJECTS条线。出于某种原因,关联数组/哈希在我这样做之前不会起作用。

    • 1

相关问题

  • Mac OS X:从 python 脚本中更改 $PATH

  • Bash 脚本:要求脚本以 root 身份运行(或使用 sudo)

  • crontab ifconfig 什么都不输出

  • 使用命令行工具按排序顺序计算重复项

  • 是否有 bash 等效于 ruby​​ 的“一些内容#{foo}”?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve