SVNの一般的および/または有用なpre-commitフックは何ですか?
22 に答える
ユーザーがコミットメッセージに実際にコメントを入力したこと、および追跡する特定の問題番号が含まれていること。
さまざまなテキストファイル(VRML、XMLなど)の絶対パスをチェックします。チェックインされたコードのほとんどに絶対パスを含めることはできませんが、ハードコードされたものを作成することを主張する人やツールもあります。
私は送信メッセージで単語数を数えます。5語以上である必要があります。これは私に対するいくつかのコメディ侮辱につながりました...
- タブを確認し、チェックインを拒否します。
- 行末に一貫性がないことを確認し、チェックインを拒否します。
- 「CR:[username]」の発生を確認し、コードレビューがない場合はチェックインを拒否します。
http://svn.apache.org/repos/asf/subversion/branches/1.6.x/www/tools_contrib.html#hook_scripts(このページは明らかに古くなっている可能性があり、もう保守されていない可能性があります。 Subversion 1.7の場合)
または直接: https ://svn.apache.org/repos/asf/subversion/trunk/contrib/
私はsvn
フックを使って次のことをするのが好きです:
- コードスタイルのより厳密なポイントを適用する
- 明らかな構文エラーをチェックします
- 「Fixes」や「Addresses」などの特別なTracキーワードが、実際に適切な問題番号の前にあることを確認してください
Twitterアカウントにメッセージを投稿するpostcommitフックがあります。twitsvnを使用します(免責事項:私はそのプロジェクトのコミッターです)。
馬鹿な?たぶん...しかし、それは私たちがリポジトリの状況をバージョン管理に挑戦しているチームメンバーの何人かに伝えるための良い方法であることがわかりました。SVNがTwitterクライアントを介して彼らと話し始めた後は、ブラックボックスのようには感じられませんでした。
ファイルタイプをチェックし、特定の禁止されたタイプが誤ってコミットされていないことを確認します(.obj、.pdbなど)。まあ、誰かがコンパイラで生成された一時ファイルの2ギガを初めてチェックインしてからではありません:(
Windowsの場合:
@echo off
svnlook log -t "%2" "%1" | c:\tools\grep -c "[a-zA-z0-9]" > nul
if %ERRORLEVEL% NEQ 1 goto DISALLOWED
echo Please enter a check-in comment 1>&2
exit 1
:DISALLOWED
svnlook changed -t %2 %1 > c:\temp\pre-commit.txt
findstr /G:"%1\hooks\ignore-matches.txt" c:\temp\pre-commit.txt > c:\temp\precommit-bad.txt
if %ERRORLEVEL% NEQ 0 exit /b 0
echo disallowed file extension >> c:\temp\precommit-bad.txt
type c:\temp\precommit-bad.txt 1>&2
exit 1
私が現在取り組んでいる会社では、これがチェックされています:
- バイナリファイルにneedslock属性が設定されている場合。
- Javaファイルに標準の著作権表示があり、現在の年が含まれている場合。
- コードが適切にフォーマットされている場合(コードのフォーマットにはJalopyを使用します)-これはばかげているように聞こえるかもしれませんが、実際には異なるバージョン間のテキスト比較が容易になります。
- コードにコミットメッセージがある場合。
- ディレクトリ構造が定義されたものに準拠している場合(すべてのプロジェクトは定義されたSVNフォルダーの下にあり、各プロジェクトにはタグ、ブランチ、トランクフォルダーが必要です)。
それだけだと思います。
コミットがチケットに関連付けられているかどうかを確認するというアイデアが好きです。それは実際に私にとって非常に理にかなっています。
コミット後のフックを使用して、作成者のプロパティをLDAPツリーからわかりやすい名前に書き換えます。(認証は従業員IDで行われます)
アーカイブにある優れたコミットフックは、すべての.VCPROJ(または.CSPROJ)Visual Studioプロジェクトをチェックして、出力ディレクトリがローカル(通常はデバッグに使用される)に変更されていないことを確認することです。
これらの問題は正しくコンパイルされますが、実行可能ファイルがないためにビルドが中断されます。
コード内の一般的な問題を見つけたり、コーディングスタイルを強制したりするために、特定の言語に対してlintのようなツールを実行することを好む人もいます。ただし、小規模で熟練したチームでは、継続的インテグレーションやコードレビュー中に、すべてのコミットを実行して、発生する可能性のある問題に対処できるようにすることを好みます。このおかげで、コミットが高速になり、より頻繁なコミットが促進され、統合が容易になります。
check-mime-type.pl pre-commitフックを使用して、コミットされたファイルにMIMEタイプと行末オプションが設定されていることを確認します。Subversionを使用して、DAVを使用してWebサイトに表示されるファイルを公開すると、MIMEタイプが設定されていないすべてのファイルがテキストファイルとして提供されます(たとえば、レンダリングされたマークアップの代わりにHTMLソースがブラウザーに表示されます)。
pre-commitとpost-commitフックコンボを使用して、svncommitからの関連エントリでbugzillaを自動的に更新します。
2番目の(pre-commit)フックを使用して、ファイルが再投稿に追加される前に、適切なsvn:eol-styleおよびsvn:keywordsプロパティがファイルに設定されていることを確認します。
ビルドを開始し、ビルドが壊れた場合に結果をメールで送信し、ビルドが再び修正されたときに全員に通知するための3番目の(コミット後の)フックがあります。
オフサイトレプリケーションが可能な限り最新であることを保証するために、svnレプリケーションを開始するための4番目の(コミット後の)フックがあります。
残念ながら、これらにソースを投稿することはできませんが、Bugzilla統合を除いて、実装は簡単であり、継続的インテグレーションにはHudsonの方がおそらく適しています。
bugzillaの統合については、scmbugを参照することをお勧めします。
RegExを介して「issue#」などのコミットメッセージに基づいたチェンジリストの詳細を含むメモをMantisバグトラッカーに挿入します。
コミットメッセージがあり、「バグ修正」より!=です。くそー、私はそれらの役に立たないメッセージを嫌いでしたか!
次のフックスクリプトを使用して、ソースコードの行末とシェルスクリプトのアクセス許可が正しいことを確認します(すべてが正常であると思われるときに誰かがWindowsにチェックインして、UNIXビルドを壊すとイライラします)。
#!/bin/bash
REPOS="$1"
TXN="$2"
# Exit on all errors.
set -e
SVNLOOK=svnlook
echo "`$SVNLOOK changed -t "$TXN" "$REPOS"`" | while read REPOS_PATH
do
if [[ $REPOS_PATH =~ A[[:blank:]]{3}(.*)\.(sh|c|h|cpp) ]]
then
if [ ${#BASH_REMATCH[*]} -ge 2 ]
then
FILENAME=${BASH_REMATCH[1]}.${BASH_REMATCH[2]};
# Make sure shell scripts are executable
if [[ sh == ${BASH_REMATCH[2]} ]]
then
EX_VALUE="true"
if [ -z "`$SVNLOOK propget -t \"$TXN\" \"$REPOS\" svn:executable \"$FILENAME\" 2> /dev/null`" ]
then
ERROR=1;
echo "svn ps svn:executable $EX_VALUE \"$FILENAME\"" >&2
fi
EOL_STYLE="LF"
else
EOL_STYLE="native"
fi
# Make sure every file has the right svn:eol-style property set
if [ $EOL_STYLE != "`$SVNLOOK propget -t \"$TXN\" \"$REPOS\" svn:eol-style \"$FILENAME\" 2> /dev/null`" ]
then
ERROR=1;
echo "svn ps svn:eol-style $EOL_STYLE \"$FILENAME\"" >&2
fi
fi
fi
test -z $ERROR || (echo "Please execute above commands to correct svn property settings." >& 2; exit 1)
done
プロジェクトをコンパイルするためのフックはどうですか?例:makeallを実行します。これにより、コンパイルされないコードを誰もチェックインしなくなります。:)
PostUpdateとPreCommitを使用してSVN1.5のファイル外部の不足を解決する
コミットメッセージの[Reviewer:xyz]のメモをチェックし、コミットを拒否するフックを楽しんでいます。
全員が正しいものを使用していることを確認するために、aspx/htmlファイルのdoctypeをチェックするために1つ作成することを考えています。
また、 Hudsonブログで説明されているように、事前(または事後)コミットフックで通知をCIサーバーにプッシュすることができます。
ケースの衝突(愚かなウィンドウ)をチェックし、require-mergeinfo.plを使用して、クライアントが少なくとも1.5であることを確認します。これにより、svn:mergeinfoが常に設定されます。