有没有办法让它如果我打电话给$ svn ci -m "some message"
它会因为我没有指定我要签入的文件而对我大喊大叫?
我会好的,或者只是让我确认我要检查整个目录,或者只是取消操作。
通常我会尝试冗长并告诉SVN我要检入的文件,但偶尔我会忘记并最终签入的内容比我想要的更多。
答案 0 :(得分:0)
在我得到答案之前,我想确保您了解Subversion的工作原理。
Subversion将更改视为更改列表而不是单个文件更改。这就是为什么只要有提交而不仅仅是单个文件,整个存储库修订都会增加。
许多习惯于不处理更改列表的版本控制系统的人都会这样做:
$ svn commit file1
$ svn commit file2
$ svn commit file3
这很糟糕,因为它打破了更改列表的概念。如果file1
,file2
和file3
都与单个更改相关,则应将它们一起提交。
使用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
,也会在长途运行中保存一些按键。