有没有办法做到这一点,如果我打电话给$ svn ci -m "some message"
我因为没有指定我要签入的文件而大喊大叫?
我可以只要求我确认我要签入整个目录,或者只是取消操作。
通常我会尽量详细地告诉 SVN 我要签入的文件,但有时我会忘记并最终签入比我想要的更多。
有没有办法做到这一点,如果我打电话给$ svn ci -m "some message"
我因为没有指定我要签入的文件而大喊大叫?
我可以只要求我确认我要签入整个目录,或者只是取消操作。
通常我会尽量详细地告诉 SVN 我要签入的文件,但有时我会忘记并最终签入比我想要的更多。
在我得到你的答案之前,我想确保你了解 Subversion 是如何工作的。
Subversion 将更改视为更改列表,而不是单个文件更改。这就是为什么每当有提交时整个存储库修订都会增加,而不仅仅是单个文件。
许多习惯于不处理变更列表的版本控制系统的人会这样做:
$ svn commit file1
$ svn commit file2
$ svn commit file3
这很糟糕,因为它破坏了更改列表的概念。如果file1
、file2
和file3
都与单个更改相关,则应将它们一起提交。
使用 Subversion 一次处理单个更改列表的标准方法。您致力于修复错误或添加功能,提交更改,然后处理下一个错误或功能。如果您同时处理两个单独的错误或功能,您真的应该有两个单独的检查。
这样做可以让您使用svn commit
将更改列表作为一个单元提交。
也就是说,如果你没有列出任何文件,有一种方法可以改变 Subversion 提交的行为,那就是定义你自己的svn
函数和命令的别名svn
。
例如,在 Kornshell 中,当您执行 acd
以反映您所在的目录时,没有简单的方法来更改提示。为了解决这个问题,您创建一个_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
在命令中添加 --username bob --password Swordfish 会怎样?)。您必须扩展该函数以处理提交命令的参数。但是,这让您大致了解如何更改命令的功能以执行此类操作。
我想出了一个 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
我不会调用 Ill call ci
,而是会在长途中节省一些击键。