【问题标题】:How do I commit in Subversion and add new files/folders and remove old files/folders automatically?如何在 Subversion 中提交并添加新文件/文件夹并自动删除旧文件/文件夹?
【发布时间】:2010-11-15 15:36:33
【问题描述】:

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

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

使用命令行,当我添加文件时我必须执行svn add,当我删除文件时我必须执行svn rm,当这一切都完成后,然后我输入svn commit,它会提交添加的,删除的和修改过的。

是否有一个命令可以让我一次性提交已删除的文件/文件夹、已添加的文件/文件夹以及已修改的文件?

【问题讨论】:

    标签: svn command-line commit


    【解决方案1】:

    自动添加新文件:

    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

    xargs(GNU 版本)的-r(或--no-run-if-empty)选项在没有来自sed 的输入时停止处理,因此消除了SVN 错误Not enough arguments provided

    【讨论】:

      【解决方案2】:

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

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

      我想要这个功能很久了,很高兴我在这里搜索过!

      【讨论】:

        【解决方案3】:

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

        【讨论】:

        • 我更依赖于 svn,但至少我明白他们为什么做出这个决定。谢谢。
        【解决方案4】:

        在 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 在你的命令中做了什么,如果文件名包含空格会发生什么
        【解决方案5】:

        如果你想用 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】:

          添加:

          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
          

          对我来说很好用。

          【讨论】:

          • 这两个sed和一个grep调用可以合并为一个,见my answer
          【解决方案7】:

          没有 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 版本似乎不存在。

          您可能想要修改脚本以获取 cmets 的参数,但这只是一个开始。您还可以将其修改为一种简单的方法来为您添加/删除,并手动进行提交。

          【讨论】:

            【解决方案8】:

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

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

            【讨论】:

              【解决方案9】:

              简而言之,没有。你必须svn addsvn delete 每个项目。

              如果您没有绑定到 SVN,其他一些源代码控制系统也提供此功能;例如,Mercurial 的hg addremove

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2023-03-17
                • 2020-11-27
                • 2012-03-06
                • 2019-01-14
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多