2

有没有办法做到这一点,如果我打电话给$ svn ci -m "some message"我因为没有指定我要签入的文件而大喊大叫?

我可以只要求我确认我要签入整个目录,或者只是取消操作。

通常我会尽量详细地告诉 SVN 我要签入的文件,但有时我会忘记并最终签入比我想要的更多。

4

2 回答 2

0

在我得到你的答案之前,我想确保你了解 Subversion 是如何工作的。

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

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

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

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

使用 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 会怎样?)。您必须扩展该函数以处理提交命令的参数。但是,这让您大致了解如何更改命令的功能以执行此类操作。

于 2012-08-13T02:30:25.480 回答
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我不会调用 Ill call ci,而是会在长途中节省一些击键。

于 2012-08-13T04:33:56.020 回答