2009-04-10 16 views
0

厳密にはミラー化されていない2つの別々のリポジトリを管理することを目的としています。両方のリポジトリは異なる開発者によって更新されるため、svnsynchは問題にはなりません。Svn Postコミットされたファイルを別のリポジトリの作業コピーにコピーするCommit Hook Post?

すべてのコミットよりもむしろスクリプトを実行する方がはるかに好きなので、スクリプトをフックすることは適切な解決策ではないかもしれません。おそらく、タイムスタンプを比較して最年少をコピーするスクリプトですか? gitに変更することをお勧めしません。

+0

を私はここ要件に完全には明らかではないよ - 開発者の二組が同じファイルを変更している場合、競合が発生します - これらは手動による介入が必要なため、完全な自動化が可能です。また、この1ウェイまたは2ウェイシンクですか? –

+0

説明が必要...おそらく質問の一例ですか? – Harvey

答えて

1

私はhook scriptにリンクしています。私はコミットするたびにリポジトリの一部をチェックアウトするのに使います。おそらくあなたのニーズに合わせて変更することができます。 svn checkoutsvn exportに変更したいと考えています。後世のために

私はここでスクリプトのテキストをコピーします:

#!/bin/bash 

# POST-COMMIT HOOK 
# 
# This is an SVN post-commit hook to automatically update a directory with the contents 
# of some part of the SVN repository every time that part of the repository is changed. 

fail() { 
    echo "[email protected]" 1>&2 
    exit 1 
} 

# USER and PASS are the username and password of an SVN user with read access to the 
# relevant part of the repository 
USER="" 
PASS="" 
# The root of the SVN repository 
SVNROOT="" 
# The path within the SVN repository to export whenever it's committed 
SVNPATH="" 
# The directory to hold the checked-out copy 
WORKING="" 

# Since environment variables are unset 
export PATH="/bin:/usr/bin:/usr/local/bin" 

getopt=$(which getopt) 

TEMP=`$getopt -o u:p:U:P:d: --long user:,pass:,password:,svn-root:,svn-path:,working-dir: -n $0 -- "[email protected]"` 

if [ $? != 0 ]; then 
    fail "Terminating...getopt failed" 
fi 

# Note the quotes around `$TEMP': they are essential! 
eval set -- "$TEMP" 

while true; do 
    case "$1" in 
     -u|--user) 
      USER=$2 
      shift 2;; 
     -p|--pass|--password) 
      PASS=$2 
      shift 2;; 
     -U|--svn-root) 
      SVNROOT=$2 
      shift 2;; 
     -P|--svn-path) 
      SVNPATH=$2 
      shift 2;; 
     -d|--working-dir) 
      WORKING=$2 
      shift 2;; 
     --) 
      shift 
      break ;; 
     *) 
      fail "Option error!";; 
    esac 
done 

test -n $SVNROOT || fail "Missing option --svn-root" 
test -n $SVNPATH || fail "Missing option --svn-path" 
test -n $WORKING || fail "Missing option --working-dir" 

REPOS="$1" 
REV="$2" 

# The path to SVN executables 
svnbin=$(which svn) 
svnlook=$(which svnlook) 
# The path to grep 
grep=$(which egrep) 

if test -n "$USER"; then 
    AUTHSTR="--username $USER --password $PASS" 
else 
    AUTHSTR="" 
fi 
svnexport="$svnbin export --revision $REV $AUTHSTR" 
svnupdate="$svnbin update --revision $REV $AUTHSTR" 
svncheckout="$svnbin checkout --revision $REV $AUTHSTR" 
svnchanged="$svnlook changed $REPOS --revision $REV" 
grepq="$grep -q" 

# If anything in the desired path has been changed 
if $svnchanged | $grepq "^[A-Z]+[[:space:]]+$SVNPATH"; then 
    # Check it out to the web root 
    if test -d $WORKING/.svn; then 
     $svnupdate $WORKING || fail "svnupdate failed" 
    else 
     $svncheckout file://$SVNROOT/$SVNPATH $WORKING || fail "svncheckout failed" 
    fi 
fi 
+0

oh noes、あなたのリンクは将来のために亡くなりました:http://stackoverflow.com/questions/446518/using-svn-post-commit-hook-to-update-only-files-that-have-been-commited – Jacksonkr

+0

ahわずかなサーバーの設定ミスです。それを指摘してくれてありがとう、それは今働く。 –

関連する問題