如果没有指定文件,则在ci上发出SVN警告

时间:2012-08-12 19:11:14

标签: svn

有没有办法让它如果我打电话给$ svn ci -m "some message"它会因为我没有指定我要签入的文件而对我大喊大叫?

我会好的,或者只是让我确认我要检查整个目录,或者只是取消操作。

通常我会尝试冗长并告诉SVN我要检入的文件,但偶尔我会忘记并最终签入的内容比我想要的更多。

2 个答案:

答案 0 :(得分:0)

在我得到答案之前,我想确保您了解Subversion的工作原理。

Subversion将更改视为更改列表而不是单个文件更改。这就是为什么只要有提交而不仅仅是单个文件,整个存储库修订都会增加。

许多习惯于不处理更改列表的版本控制系统的人都会这样做:

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

这很糟糕,因为它打破了更改列表的概念。如果file1file2file3都与单个更改相关,则应将它们一起提交。

使用Subversion将标准方法一次用于单个更改列表的标准方法。您可以修复错误或添加功能,提交更改,然后处理下一个错误或功能。如果您同时处理两个单独的错误或功能,您应该有两个单独的结帐。

这样做可以让您使用svn commit将更改列表作为一个单元提交。


也就是说,有一种方法可以改变Subversion提交的行为,如果你没有列出任何文件,那就是定义你自己的svn函数和svn命令的别名

例如,在Kornshell中,当您执行cd以反映您所在的目录时,没有简单的方法来更改提示。要解决此问题,您需要创建_cd函数这会更改目录和提示。然后,将cd命令替换为_cd函数。

在您的情况下,您将定义一个_svn函数,该函数查看第一个参数并查看它是否为commit。如果不是,您可以安全地执行实际的svn命令。如果第一个参数是commit,那么您可以查看是否有第二个参数。如果没有',您可以假设您忘记列出文件,然后退出。该函数看起来像这样:

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 - 用户名bob --password swordfish`添加到命令中,该怎么办?)。您必须扩展函数以处理commit命令的参数。但是,这使您可以更好地了解如何更改命令的功能以执行此类操作。

答案 1 :(得分:0)

我提出了一个bash脚本来调用而不是SVN提交,它会对参数进行一些检查

#!/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,也会在长途运行中保存一些按键。