如何在Subversion中提交并添加新文件/文件夹并自动删除旧文件/文件夹?

时间:2009-07-30 23:46:07

标签: svn command-line commit

TortoiseSVN宠坏了,我现在正在使用Linux上的命令行与SVN存储库进行交互。

在TortoiseSVN中,我只提交更改,它会显示添加内容,删除内容和修改内容的列表。我会检查所有方框,然后单击确定

使用命令行,当我添加文件时,我必须执行svn add,当我删除文件时,我必须执行svn rm,当完成所有操作后,我输入svn commit,然后提交添加,删除和修改。

是否有一个我可以使用的命令,只提交我删除的文件/文件夹,我添加的文件/文件夹以及我一次修改过的文件?

9 个答案:

答案 0 :(得分:9)

在Windows下,以下批处理文件可以正常工作:

for /f "tokens=2*" %%i in ('svn status %1 ^| find "?"') do svn add "%%i"  
for /f "tokens=2*" %%i in ('svn status %1 ^| find "!"') do svn delete "%%i"  
svn commit -m "Automatic commit" %1  

只需将上面的三行保存在名为“autocommit.bat”的文件中即可。如果从工作目录运行它,则无需指定参数。如果您在另一个目录中,可以将其称为autocommit.bat c:\MyProjectFolder

答案 1 :(得分:6)

Nader Shirazie在posted script中拥有正确的命令。这是Linux的单行版本:

svn add  $(svn st | sed -n 's/^[A?] *\(.*\)/\1/p')

我很长一段时间都想要这个功能,很高兴我在这里搜索过!

答案 2 :(得分:3)

没有SVN命令,但我确定有一两个脚本可以扫描未版本/丢失的文件并发出相应的命令......

我在这里找到了一个:http://gael-varoquaux.info/computers/svnautocommit/index.html

添加完整脚本

#!/bin/bash


#------------------------------- Subroutines ---------------------------------
usage(){
echo " Usage: $(basename $0) PATH"
echo ""
echo "Automatically commits the changes of svn working copy located in PATH."
echo "The new files are automatically added and the files that have been removed"
echo "are removed."
echo ""
echo "By Gael Varoquaux"
}

#------------------------------- Process the options -------------------------
if [ $# -eq 1 ]
then
    workingdir="$1"
else
    usage
    exit 1
fi

if ! cd $workingdir
then
    echo $workingdir is not a accessible path.
    usage
    exit 1
fi

#------------------------------- Find out what has changed -------------------

# A warning if this fails :
echo "SVN autocommit failed" > $HOME/local/motd

svnstatus=$(svn status $workingdir)
added=$(printf "$svnstatus" | sed -n 's/^[A?] *\(.*\)/\1/p')
removed=$(printf "$svnstatus" | sed -n 's/^! *\(.*\)/\1/p')

if [ "x$added" != "x" ]
then
    echo adding "$added" to repository
    svn add $added
fi

if [ "x$removed" != "x" ]
then
    echo removing "$removed" to repository
    svn remove $removed
fi

svn commit -m "autocommit" && rm $HOME/local/motd

不幸的是,Python版似乎不存在。

您可能希望修改脚本以获取注释参数,但这是一个开始。您也可以将其修改为一种为您添加/删除的简单方法,并手动执行提交。

答案 3 :(得分:3)

使用标准的SVN工具,没有这样的东西 - 在the FAQ中提到它是一件坏事。

答案 4 :(得分:3)

添加:

svn status | grep "^\?" | sed -e 's/? *//' | sed -e 's/ /\\ /g' | xargs svn add

删除:

svn status | grep "^\!" | sed -e 's/! *//' | sed -e 's/ /\\ /g' | xargs svn remove

它适用于我。

答案 5 :(得分:1)

如果您想使用PowerShell执行此操作,这是一个使用svn status的简单函数:

svn status | ? { $_ -match '^\?\s+(.*)' } | % { svn add $Matches[1] }

积分转到an answer to Stack Overflow question SVN command to delete all locally missing files。我调整了他的工作以获取新文件。

PowerShell文件我看起来像这样:

# Delete missing files
svn status | ? { $_ -match '^!\s+(.*)' } | % { svn rm $Matches[1] }

# Added new files
svn status | ? { $_ -match '^\?\s+(.*)' } | % { svn add $Matches[1] }

# Commit repository
svn commit -m "This commit is done by a PowerShell bat"

答案 6 :(得分:0)

简而言之,没有。每件商品都必须svn addsvn delete

如果您不依赖SVN,其他一些源控制系统会提供此功能;例如,Mercurial的hg addremove

答案 7 :(得分:0)

虽然使用行参数的简洁命令功能强大,但它们可能会错过(或失败)包含带空格的文件名。以下命令来自an answer to a similar question,其中包含所有文件。

svn add --force * --auto-props --parents --depth infinity -q

答案 8 :(得分:0)

自动添加新文件:

svn st | sed -rn '/^\?/s/^.{8}(.+)$/\1/p' | xargs -r svn add

自动删除已删除的文件:

svn st | sed -rn '/^!/s/^.{8}(.+)$/\1/p' | xargs -r svn rm

说明

这基本上是luca’s answer的精简版,它将grep和两个sed调用合并为一个。

SED

  • -r使用扩展正则表达式
  • -n未通过输入
  • filters行以?!开头(分别为/^\?//^!/
  • cuts前8个字符(包含标记):s/^.{8}//
  • prints输出的其余部分:s/(.+)$/\1/p

另请参阅:http://www.grymoire.com/Unix/sed.html

xargs的

-r没有输入时,xargs(GNU版本)的--no-run-if-empty(或sed)选项会停止处理,因此消除了SVN错误{{1 }}