1

Subversion (または実際には他の VCS ですが、svn でもっと遊んだことがあります) を使用する論理的な方法を設定しようとしました。

私の問題を説明することから始めましょう。私たちは顧客の Web サイトを毎日変更する必要がある数人の同僚ですが、顧客は Web サイトの「管理パネル」からいくつかのファイルを変更することもできます。サーバー上でいくつかのファイルが生成されるだけでなく、ログファイル、エクスポート/インポートデータ、サイトマップなど.

私たちは現在 FTP で作業しており、ある種のファイル履歴を維持するために .bak.revision#.php ファイルを作成していますが、ほとんど管理できません。その上、ファイルのローカル コピーが必要な IDE として Netbeans を使用しています。

プロジェクトを開始するには、変更したファイルを顧客と同期する必要があります (最悪の場合、プロジェクト全体をダウンロードする必要があります) (これには永遠にかかる可能性があります)。

私は Netbeans での作業を本当に楽しんでいますが、今では代わりに notepad++ を使用することがあります。

プロジェクトを http フォルダーにエクスポートするコミット後のフックを使用して、SVN を操作するための非常に優れた方法をセットアップしました。

しかし、サーバー上で変更された可能性のあるファイル、たとえば、顧客自身が変更できる顧客の CSS ファイルを上書きしたくありません。

だから私はこの問題を抱えているのは私だけではないと思いました.チームの全員がそうではない場合、どのようにSVNを操作するのですか? (私の場合はお客様)

私はそれらのファイルで svn:ignore を使用できるかもしれません。

(これはテスト環境です) 私の post commit フックは非常に単純です。svn エクスポート ファイル:///svn/repo/LIVE /var/www/html/ --force


編集 もっともらしい解決策を調べます。事前コミットを作成するか、さらに良いのは?pre-update? 既にレポにある上書きファイルをインポートするためのフック、それは私の問題を解決するでしょうか?

NVM インポートはコミットを実行します。commit と pre commit は、無限ループが作成されるため、うまく機能しません。


よろしくイエスス

4

4 に答える 4

1

あなたの場合の最も論理的かつ技術的な方法(しかし最も簡単ではない)は

  • サイト ツリーを共通の (Netbeans を使用した) リポジトリの作業コピーに変換する - サーバーに Subversion をインストールし、インストール後にいくつかのトリックを行う必要があるため、ホストへの SSH ルート アクセスが必要です。
  • 管理パネルの crontab ジョブ | 特別なボタンを使用して、サイトの直接の変更をリポジトリにコミットします
  • この場合、「外部」ホストからのコミット後にサーバーのWCを更新する必要があるポストコミットフックの変更

より風変わりな方法: Subversion for everyone (一部のユーザー向け - 舞台裏)

  • 誰もが (直接) または間接的に Subversion を使用している - 誰もサイト上のファイルに触れていない
  • 現在行われているように、サイトに (エクスポートとして) 保存されたリポジトリからの変更

開発者にとって、この方法では何も変わりません。あなたが提案する技術的に平凡な顧客の場合、 EasySVN(したがって、Assemblaのリポジトリ)を準備および構成します-ローカルフォルダー(またはツリー)を取得するだけで、すべての変更は(自動的に)関連するリポジトリと同期されます(逆方向も機能します- WC に配信されたレポからのバックグラウンド更新)。AssemblaスペースのSSHまたはFTPツールがサイトに変更を転送します(コミット時に自動的に、または手動でオンデマンドで)

于 2013-02-08T09:57:23.360 に答える
1

DVCS を Web サーバー上でローカルに使用できます。集中型の VCS と比較して、分散型の VCS は、顧客側で起こっていることをチーム内で起こっていることから切り離します。また、このシナリオはすべてマージに関するものであり、それに値するすべての DVCS はすべてマージに関するものであり、ベストを尽くします。

ここでは Git を使用した具体的なワークフローを示しますが、これは他の DVCS でも実行できます。{TEAM}ここでのワークフローを簡素化するために、チームと Web サーバーの両方から到達可能なリポジトリがあると仮定しますが、それ以外の方法は複数あります。ファイルを変更する方法で開発チームを Web サーバーのリポジトリに直接プッシュすることはできません。Git でチェックアウトされたブランチにプッシュできない理由についての私の説明を参照してください。

ウェブサーバーは履歴を保持します

には、開発が行われるメイン ブランチTEAM/devが 1 つあります。次のように Web サーバーのリポジトリを作成します。

~$ git clone -b dev {TEAM} /var/www/mystuff
~$ cd /var/www/mystuff
mystuff$ git checkout -b locall-changes

ある時点で、Web サーバーが行ったことをすべてコミットします。これは、cron ジョブ、PHP コード、または手動による介入である可能性があります。

mystuff$ git ci --all -m "Webserver modifications"

--allオプションは、Git によって既に追跡されているファイルへのすべての変更をコミットするように Git に指示します。Web サーバーが追跡したい新しいファイルを作成する可能性がある場合は、無視パターン (ログ ファイルなど) を配置し、次のようにコミットする必要があります。

mystuff$ git add .
mystuff$ git ci -m "Webserver modifications"

この時点で、最初のクローン作成以降、Web サーバーとチームの間で通信が行われていないことに注意してください。これが DVCS の強みです。Web サーバーの操作とその保持履歴は完全に自律的です。倒産したり、核兵器で一掃されたりしても、それは機能し続けるだけでなく、誰かが埋めて、あなたがしていたことをシームレスに続けることができます.

あなたはあなたの開発と融合します

リポジトリを自分の側でリモートにすることで、Web サーバーを追跡できます (これは 1 回だけ行います)。

myrepo$ git remote add webserver ssh://webserver/var/www/mystuff
myrepo$ git fetch webserver
myrepo$ git branch changes webserver/local-changes

新しいコードを Web サーバーに公開する場合は、まずその履歴を取得し、どのようにマージされるかを確認します。

myrepo$ git co changes
myrepo$ git pull

これにより、リモート Web サーバーから新しいコミットが取得され、変更ブランチがWeb サーバー上の現在のローカル変更に更新されます。

myrepo$ git merge dev

マージがどのように行われたかを確認し、競合を解決してマージをコミットしたら、{TEAM} で使用できるようにします。

myrepo$ git push {TEAM} changes

ウェブサーバーに戻る

Web サーバーの 1 つで、そのマージをプルするだけです。唯一の問題は、その間にいくつかの新しいコミットが行われた可能性があることです。確かに、マージが現在のコミットの直接の子孫である場合にのみ、ブランチを強制的に更新できます (Git はこれを早送りマージと呼びます)。

mystuff$ git pull --ff-only {TEAM}/changes

FF が不可能な場合、このコマンドはファイルを変更せず、ゼロ以外のエラー コードで終了します。これにより、自動化されたスクリプトでトリガーして、実際には発生しなかったかどうかを知らせることができます。

于 2013-02-13T03:07:14.050 に答える
0

顧客に svn の使用を強制するのではなく (意識しているかどうかにかかわらず)、顧客のサイトをレプリカとして扱い、Unisonのようなツールを使用して、管理されていない側 (顧客) を管理されている側 (あなたのもの) と一緒に維持します。Unison は rsync に似ていますが、両方向の変更を処理する点が異なります。そのため、顧客が変更したファイルはシステムにコピーされます。

したがって、ワークフローは次のとおりです。

  • ユニゾン (ローカルとリモートを同期し、変更をプルダウン)
  • svn commit (変更をチェックイン)
  • 編集 編集 編集
  • svn commit (変更をチェックイン)
  • ユニゾン(リモートをローカルと同期し、変更がある可能性があるものをすべてプルダウンします)
于 2013-02-12T22:54:25.483 に答える
0

:::私の発見:::

(@LazyBadger この回答はコメントに入れるには長すぎました。)

エクスポートが機能しません。実際の作業ディレクトリが必要です。しかし、httpd.conf で直接アクセスを拒否できます。つまり、.htaccess ファイルに問題はありません。

UPDATE を使用して、コミット後のスクリプトで Web ディレクトリを最新の状態に保つことができます。(下の例)

#!/bin/sh

REPOS="$1" REV="$2" cd /var/www/html/ 
MESSAGE=$(svnlook propget --revprop -r $REV $REPOS svn:log) 
Author=$(svnlook propget --revprop -r $REV $REPOS svn:author) 
CHANGES=$(svnlook changed -r $REV $REPOS)

echo "" >> /$REPOS/SVN.Log 
echo "Commit | $REPOS | $REV | $MESSAGE | $CHANGES | $Author" >> /$REPOS/SVN.Log 
echo update >> /$REPOS/SVN.Log 
svn update >> /$REPOS/SVN.Log 
echo klar >> /$REPOS/SVN.Log

顧客が編集したファイルの同期を維持するには、ignore を使用して (単純にそれらのファイルをリポジトリに置かないようにします)、おそらくバイナリ ファイルとログ ファイルに使用してリポジトリのサイズを制御します。

次に、コミットデーモンを使用してリポジトリを最新の状態に保つことができますが、残念ながらEasySVNソリューション(ちなみに素晴らしいソフトウェアであり、無料で、どのサーバーでも使用できます)はLinux環境用ではありませんでした(まだ)。

ちなみに、EasySVN は、ファイル履歴の大きな利点を利用して、任意の SVN にファイルをバックアップするために簡単に使用できます。注意喚起!svn+ssh サポートを使用するには、-q フラグを処理できる sshclient をダウンロードする必要があります (たとえば、このパッケージから: http://sharpsvn.open.collab.net/servlets/ProjectProcess?pageID=3794 )。そして、パテからページェントを使用します

しかし、コミット スクリプトを作成したり、CRON を使用してコミットを実行したりすることもできます。これは実際には php 保存機能に埋め込む必要がありますが、これは主要な仕事であり、おそらくソフトウェアの将来のリリースではそうなるでしょう :)

コミットスクリプトの例:

#!/bin/sh
cd /var/www/html/ && svn commit -m webedit -q

もちろん、これはかなり改善できます。たとえば、最初に変更を確認することができます ^^.

変更をチェックし、必要に応じてコミットするデーモンのようなスクリプトの例

#!/bin/bash
SVNREPOS=( "/var/www/html/" )
cd /PATH/TO/THIS/SCRIPT/
LCK_FILE=`basename $0`.lck
if [ -f "${LCK_FILE}" ]; then
  echo LOCK exists
  MYPID=`head -n 1 $LCK_FILE`  

  if [ -n "`ps -p ${MYPID} | grep ${MYPID}`" ]; then
    echo `basename $0` is already running [$MYPID].
    exit
  else
    rm "${LCK_FILE}" -f
    sh $0
    exit
  fi

else
  echo $$ > $LCK_FILE
   while :; do
    for i in "${SVNREPOS[@]}"
     do
      cd $i
         #What are we doing here? Basicly we are testing if anything is to commit, if so commit it
         test ! $(svn st|wc -l) -eq 0 && svn ci -m SERVERCOMMIT -q 
      sleep 5s
     done
    done
echo ENDED LOOP IT SHOULD NOT HAVE DONE THAT
 rm "${LCK_FILE}" -f
 sh $0
fi

echo $$ > $LCK_FILE

デーモンを開始/停止するための init.d スクリプト

#! /bin/bash
#SVN CHANGED MONITOR DAEMON
. /etc/init.d/functions

RETVAL=0
SCRIPTDAEMON=/PATHTO/changemonitor.sh
getpid() {
    pid=`ps -eo pid,command | grep "sh $SCRIPTDAEMON" | grep -v "grep" | awk '{ print $1 }'`
    }

start(){
    gprintf "Starting SVNChangeMonitor: "
    echo_failure
    getpid
    if [ -z "$pid" ]; then
      sh $SCRIPTDAEMON &
    fi

     getpid
     if [ -n "$pid" ]; then
         echo_success
     else
         echo_failure
     fi
    echo
    return $RETVAL
}

stop() {
    gprintf "Stopping SVNChangeMonitor: "
    echo_failure
    getpid
    if [ -n "$pid" ]; then
        kill -s kill $pid
        rm $SCRIPTDAEMON.lck -f

        getpid
         if [ -z "$pid" ]; then
             echo_success
         else
             echo_failure
         fi

    else
        echo_failure
    fi
    echo
    return $RETVAL
}

# See how we were called.
case "$1" in
  start)
        start
        ;;
  stop)
        stop
        ;;
  restart)
        stop
        start
                gprintf "SVNChangeMonitor is restarted\n"
        ;;
  status)
        getpid
        if [ -n "$pid" ]; then
               gprintf "SVNChangeMonitor (pid %s) is running." "$pid"
               echo_success
                echo
        else
                RETVAL=1
                gprintf "SVNChangeMonitor is stopped\n"
                                echo
        fi
        ;;
  *)
        gprintf "Usage: %s {start|stop|restart|status}\n" "$0"
        echo
        exit 1
        ;;
esac

exit $RETVAL

あなたの親切な助けと指針をありがとう!

于 2013-02-12T22:42:22.130 に答える