2

チェックインするファイルを指定していないことを呼び出す$ svn ci -m "some message"と、怒鳴るようにする方法はありますか?

ディレクトリ全体をチェックインすることを確認するように求めるだけでも、操作をキャンセルするだけでもかまいません。

通常は、SVN にチェックインするファイルを詳細に伝えようとしますが、場合によっては忘れてしまい、必要以上にチェックインしてしまうこともあります。

4

2 に答える 2

0

あなたの答えにたどり着く前に、Subversion がどのように機能するかを理解してもらいたいと思います。

Subversion は、個々のファイルの変更としてではなく、変更リストとして変更を調べます。そのため、個々のファイルだけでなく、コミットがあるたびにリポジトリ全体のリビジョンがインクリメントされます。

変更リストを処理しないバージョン管理システムに慣れている多くの人々は、次のようなことをしています:

$ svn commit file1
$ svn commit file2
$ svn commit file3

これは、変更リストの概念を壊すため、悪いことです。file1file2、およびがすべて単一の変更に関連している場合は、file3一緒にコミットする必要があります。

Subversion を使用して一度に 1 つの変更リストを操作する標準的な方法。バグの修正や機能の追加に取り組み、変更をコミットしてから、次のバグや機能に取り組みます。同時に 2 つの個別のバグまたは機能に取り組んでいる場合は、実際には 2 つの個別のチェックアウトが必要です。

svn commitそのようにすると、変更リストを単一のユニットとしてコミットするために使用できるようになります。


そうは言っても、ファイルをリストしない場合、Subversion コミットの動作を変更する方法があります。それは、独自の関数とコマンドsvnのエイリアスを定義することです。svn

たとえば、Kornshell では、現在cdのディレクトリを反映するためにプロンプ​​トを変更する簡単な方法はありません。これを回避するに_cdは、ディレクトリとプロンプトを変更する関数を作成します。次に、cdコマンドを_cd関数にエイリアスします。

あなたの場合、_svn最初のパラメーターを見て、それが であるかどうかを確認する関数を定義しますcommitsvnそうでない場合は、実際のコマンドを安全に実行できます。最初のパラメーターが の場合commit、2 番目のパラメーターがあるかどうかを確認できます。存在しない場合は、ファイルを一覧表示するのを忘れたと見なして終了できます。関数は次のようになります。

function _svn {
  if [[ $1 == "commit" ]] && [[ -z $2 ]]
  then
      echo "You need to specify the exact files to commit"
      exit 2
  else
     \svn $*
  fi

次に、エイリアスを作成します。

alias svn="_svn"

現在、実行svnしてもコマンドは実行されませんsvn(少なくとも直接)。代わりに、エイリアスが_svn関数を実行します。

ところで、私は自分の関数でパラメーター処理を想定していません。-m "this is a test") or(コマンドに --username bob --password swordfish`を追加するとどうなりますか?) パラメータを処理する関数を commit コマンドに拡張する必要があります。ただし、これにより、コマンドの機能を変更してこのようなことを行う方法の一般的なアイデアが得られます。

于 2012-08-13T02:30:25.480 に答える
0

SVNコミットの代わりに呼び出すbashスクリプトを思いつきました。これは、パラメーターのチェックを行います

#!/bin/bash
# usage: ci -[file1...fileN] [-m message]]
# a wrapper for svn ci with some extra features
#  - If no message is given, will prompt user for message
#  - If no files are given, will show user list of files that
#       will be checked in and ask them to confirm or select files 
#       they want to check in

FILES=""
MESSAGE=""
MESSAGE_FLAG=0

# parse files and message from input
for var in "$@"
do
        if [ $MESSAGE_FLAG -eq 1 ]
        then
            MESSAGE="$var"
            break
        elif [ "$var" = "-m" ] 
        then
            MESSAGE_FLAG=1 # Indicates message is coming next
        else
            FILES="$FILES $var"
        fi
done

# ask for message if not present
if [ "$MESSAGE" = "" ]
then
    echo "Enter a message:"
    read MESSAGE
fi

# Check files have been specified
if [ "$FILES" = "" ]
then
    echo "No files have been specified"
    # call to svn st to print out list of modified files
    svn st
    echo "Do you want to check in all of these files (y/n/q):"
    read override
    if [ "$override" != "y" ]
    then
        if [ "$override" = "q" ]
        then
            exit
        fi
        echo "What files do you want to check in?"
        read FILES
    fi
fi

svn ci $FILES -m "$MESSAGE"

私は JavaScript プログラマーなので、これを機能させるために BASH の本をよごす必要があったので、注意して使用してください

私はこのファイルを PATH に入れて ci と呼んだので、呼び出す代わりに を呼び出しsvn ciます。これciにより、長時間のキーストロークも節約できます。

于 2012-08-13T04:33:56.020 に答える