タイトルは奇妙に聞こえるかもしれませんが、私は次のことを達成しようとしています。
SVN リポジトリの場所: /home/flx/svn/flxdev SVN リポジトリ「flxdev」の構造:
+ Project1
++ files
+ Project2
+ Project3
+ Project4
コミットを実行すると、もう一方の側で自動的にチェックアウトするコミット後フックを設定しようとしています。
コミット後のドキュメントには、次の内容が明示的に記載されています。
# POST-COMMIT HOOK
#
# The post-commit hook is invoked after a commit. Subversion runs
# this hook by invoking a program (script, executable, binary, etc.)
# named 'post-commit' (for which this file is a template) with the
# following ordered arguments:
#
# [1] REPOS-PATH (the path to this repository)
# [2] REV (the number of the revision just committed)
そこで、テストするために次のコマンドを作成しました。
REPOS="$1"
REV="$2"
echo "Updated project $REPOS to $REV"
しかし、例えばProject1のファイルを編集すると、次のように出力されます。「プロジェクト /home/flx/svn/flxdev を 1016 に更新しました」
私はこうしたいと思っています:「プロジェクト Project1 を 1016 に更新しました」
この変数を使用すると、コミット後にプロジェクトごとに異なるアクションを実行するように指定できます。プロジェクト パラメータを指定するにはどうすればよいですか?
ありがとう!
デニス
答え1
次のような方法で、必要な処理を実行できる可能性があります。
#!/bin/bash
REPOS="$1"
REV="$2"
echo In revision $REV, the following projects were changed:
svnlook dirs-changed "$REPOS" --revision "$REV" \
| sed 's%/.*%%' \
| sort -u \
| while read PROJ ; do
echo "$PROJ"
done
シェル スクリプトにあまり詳しくない場合のために、何が起こっているのかを説明します。
svnlook
変更されたディレクトリのリストを取得するために使用しますsed
最初の「 」とその後のすべてを切り捨てるために使用します/
。その結果、重複している可能性のあるプロジェクト名のリストが作成されます。sort -u
重複を排除するために「一意に並べ替え」を使用します- それぞれの名前を 1 つずつ $PROJ に読み込み、それに対して何らかの処理を行います。
プロジェクト名で実行したい操作に行を置き換えることができますecho "$PROJ"
。同じコミットで複数のプロジェクトが変更された場合、そこに記述したものは変更されたプロジェクトごとに 1 回実行され、$PROJ が適切に設定されます。
このスクリプトは、リポジトリのルートにファイルが追加されたかどうかは表示しませんが、ディレクトリが追加された場合は、変更されたプロジェクトのリストに表示されます。ルートもリストに表示したい場合は、次の sed 行を置き換えて、「/」として表示することができます。これを行う場合は、誤ってリポジトリ全体をチェックアウトしないように注意してください。
...
| sed '/^\/$/!s%/.*%%' \
...