標題聽起來一定很奇怪,但我正在努力實現以下目標:
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
如果您不太熟悉 shell 腳本,請解釋一下正在發生的事情:
- 我們用來
svnlook
取得已更改的目錄列表 - 我們通常
sed
會砍掉第一個「/
」及其後的所有內容——這樣我們就有了一個項目名稱列表,可能有重複的項目名稱。 - 我們使用
sort -u
(“排序唯一”)來消除重複項 - 我們將每個名稱一一讀入 $PROJ 並對其進行處理。
您可以將該echo "$PROJ"
行替換為您想要對項目名稱執行的任何操作。如果在同一提交中更改了多個項目,則您放置的任何內容都會為每個更改的項目運行一次,並適當地設定 $PROJ。
該腳本不會顯示檔案是否已新增至儲存庫的根目錄,但如果新增了目錄,它們將顯示在修改的項目清單中。如果您也希望列出根目錄,可以取代以下 sed 行,它將顯示為「/」。如果您這樣做,請小心不要意外檢查整個儲存庫!
...
| sed '/^\/$/!s%/.*%%' \
...