被TortoiseSVN宠坏了,我现在正在使用Linux上的命令行与SVN存储库进行交互。
在TortoiseSVN中,我只提交更改,它会显示添加内容,删除内容和修改内容的列表。我会检查所有方框,然后单击确定。
使用命令行,当我添加文件时,我必须执行svn add
,当我删除文件时,我必须执行svn rm
,当完成所有操作后,我输入svn commit
,然后提交添加,删除和修改。
是否有一个我可以使用的命令,只提交我删除的文件/文件夹,我添加的文件/文件夹以及我一次修改过的文件?
答案 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 add
和svn 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
调用合并为一个。
-r
使用扩展正则表达式-n
未通过输入?
或!
开头(分别为/^\?/
和/^!/
)s/^.{8}//
s/(.+)$/\1/p
另请参阅:http://www.grymoire.com/Unix/sed.html
当-r
没有输入时,xargs
(GNU版本)的--no-run-if-empty
(或sed
)选项会停止处理,因此消除了SVN错误{{1 }}