【问题标题】:How do I 'svn add' all unversioned files to SVN?如何将所有未版本控制的文件“svn 添加”到 SVN?
【发布时间】:2009-07-01 23:46:00
【问题描述】:

我正在寻找一种自动将工作副本中的所有未版本控制文件“svn 添加”到我的 SVN 存储库的好方法。

我有一个实时服务器,可以创建一些应受源代码控制的文件。我想要一个简短的脚本,我可以运行它来自动添加这些,而不是一次添加一个。

我的服务器正在运行 Windows Server 2003,因此 Unix 解决方案无法运行。

【问题讨论】:

  • @Saul 这个问题显然早于您链接的问题,所以我看不出它是如何重复的。如果有的话,另一个问题是重复的。
  • Cygwin 是一个选项。在任何 Windows 环境中为您提供 bash 的强大功能。使用了 10 多年,但问题非常轻微。

标签: svn command-line windows-server-2003


【解决方案1】:

这是有效的:

c:\work\repo1>svn add . --force

添加子目录的内容。

不添加被忽略的文件。

列出添加了哪些文件。

命令中的点表示当前目录,如果要添加与当前目录不同的目录,可以将其替换为特定目录名称或路径。

【讨论】:

  • 其实应该是.\* 或者如果svn root在不同的目录stuff\svn_root\*
  • 我不关注。 SVN 的命令在执行它们的路径的上下文中执行,这是意料之中的。单独的“svn add .\*”不会递归并打印大量警告垃圾邮件,从而无法查看实际添加的内容。 “svn add .\* --force” 确实递归但也打印“svn:跳过参数:E200025:'.\.svn'以保留名称结尾”。所以这似乎比我原来的解决方案更糟糕。
  • 我指出您可能在 SVN 上没有整个 C 驱动器 ;-),因此您应该添加一个路径。从我的测试指定路径为stuff\svn_root 不会在子目录中添加文件(例如在stuff\svn_root\already_in_svn\not_in_svn.txt 中)。因此是最后的明星。
  • @Nux 这么多年过去了,我终于明白了你的意思:) 在命令中,点是指定当前目录的路径。当然,可以提供任何有效的替代方案。
  • 这是正确的答案。我不确定包含添加忽略文件的解决方案如何占据首位。 @Neutrino,建议删除您对 joey 的评论,该评论不再出现在此页面上,并添加一行强调您的建议不会添加被忽略的文件
【解决方案2】:

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

很棒的提示!一句话:我的Eclipse 自动将新文件添加到忽略列表中。这可能是配置问题,但无论如何:--no-ignore 选项会有所帮助。

在此之后,您可以提交:

svn commit -m 'Adding a file'

【讨论】:

  • 很棒的提示。比使用 svn status 要好得多。 “svn add --force”似乎就足够了。
  • 是否有一种简单的方法可以将其设置为缩短的宏(即,您可以使用 git)?另外,是否可以更新此答案以解释每一位?
  • @MrDuk:缩短:alias magic="svn add --force * --auto-props --parents --depth infinity -q" - 解释:svn help add
  • 问题这是添加被忽略的文件正确吗?不可取。
  • @Name - 你需要把*放在最后,否则它不起作用(对我来说是租用的)
【解决方案3】:

这是一个不同的question to mine,但有一个属于这个问题的答案:

svn status | grep '?' | sed 's/^.* /svn add /' | bash

【讨论】:

  • 这使用了 OP 说他没有的 UNIX 工具(grep、sed、bash)。
  • 如果你真的想要的话,你也可以在 windows 上挖掘 sed 和 grep。
  • 很抱歉对 cygwin 评论的支持,不是故意的(我无法撤消它)。事实上,我认为 cygwin 在 Windows 上是最丑陋的。您仍然可以使用 findstr 而不是 grep,它至少从 Windows 2000 开始就可以工作,而无需安装任何额外的东西。
  • 我和 mbyrne215 在一起;这个答案对我的帮助超过了 OP 的解决方案,所以我投票赞成。在 OS X 10.6.7 中完美运行。
【解决方案4】:

这对我有用:

svn add `svn status . | grep "^?" | awk '{print $2}'`

(Source)

由于您已经解决了 Windows 的问题,因此这是一个 UNIX 解决方案(遵循 Sam)。我在这里添加,因为我认为它对于那些提出相同问题的人仍然有用(因为标题不包含关键字“WINDOWS”)。

注意(2015 年 2 月): 正如“bdrx”所评论的那样,上述命令可以通过这种方式进一步简化:

 svn add `svn status . | awk '/^[?]/{print $2}'`

【讨论】:

  • 漂亮、紧凑、简洁,也非常适合扩展。谢谢。
  • 太棒了。也易于扩展,修改删除等。
  • 非常适合我的需要。谢谢!
  • 为什么人们总是先 grep 然后管道到 awk? awk 可以做模式匹配:awk '/^[?]/{print $2}';不需要额外的 grep 过程。
  • @bdrx:也许是因为 grep 通常与模式匹配相关联?就我个人而言,我使用 grep 比使用 awk 更有经验。我不知道你可以在 awk 中做这些事情,所以我将开始在我的脚本中更多地使用 awk。谢谢!
【解决方案5】:

你可以使用命令

svn add * force--

svn add <directory/file name>

如果您的文件/目录没有递归添加。然后检查一下。

递归添加是默认属性。你可以在SVN book看到。

问题可能在您的忽略列表或全局属性中。

我得到了解决方案google issue tracker

检查全局属性以忽略星号(*)

  • 在窗口中的 repo 中单击鼠标右键。选择TortoiseSVN &gt; Properties
  • 看看你有没有属性svn:global-ignores with a value of *
  • 如果您有star(*) 的属性,那么它将忽略递归添加。所以删除这个属性。

检查全局忽略模式以忽略星号(*)

  • 在窗口中的 repo 中单击鼠标右键。选择TortoiseSVN &gt; Settings &gt; General
  • 如果您没有在此处设置 star(*),请参阅全局忽略模式。
  • 如果您找到了star(*),请删除此属性。

这个人also explained为什么在我的项目中添加了这个属性。

它到达那里的最相似的方式是有人右键单击没有任何扩展名的文件并选择 TortoiseSVN -> SVN Ignore -> *(递归),然后提交。

您可以查看日志以查看谁提交了该属性更改,找到 找出他们真正想要做的事情,并要求他们做得更多 以后要小心。 :)

【讨论】:

    【解决方案6】:
    svn add --force .
    

    这将在当前目录和所有版本控制的子目录中添加任何未版本控制的文件。

    【讨论】:

      【解决方案7】:

      我总是用:

      复制粘贴

      svn st | grep "^\?" | awk "{print \$2}" | xargs svn add $1
      

      【讨论】:

      • Op 明确指出 Unix 解决方案对他没有用处。
      • 这假定 Linux 或类似的(例如 MinGWCygwin)。 OP 声明:“我的服务器运行的是 Windows Server 2003,因此无法使用 Unix 解决方案。”
      【解决方案8】:

      由于这篇文章被标记为 Windows,我想我会为 Windows 制定一个解决方案。我想自动化这个过程,我制作了一个 bat 文件。我拒绝用 C# 制作 console.exe。

      我想在开始提交过程时添加任何未添加到我的存储库中的文件或文件夹。

      许多答案的问题是他们会列出未版本化的文件,根据我在TortoiseSVN 中的忽略列表,这些文件应该被忽略。

      这是我的钩子设置和批处理文件

      龟钩脚本:

      "start_commit_hook".
      (where I checkout) working copy path = C:\Projects
      command line: C:\windows\system32\cmd.exe /c C:\Tools\SVN\svnadd.bat
      (X) Wait for the script to finish
      (X) (Optional) Hide script while running
      (X) Always execute the script
      

      svnadd.bat

      @echo off
      
      rem Iterates each line result from the command which lists files/folders
      rem     not added to source control while respecting the ignore list.
      FOR /F "delims==" %%G IN ('svn status ^| findstr "^?"') DO call :DoSVNAdd "%%G"
      goto end
      
      :DoSVNAdd
      set addPath=%1
      rem Remove line prefix formatting from svn status command output as well as
      rem    quotes from the G call (as required for long folder names). Then
      rem    place quotes back around the path for the SVN add call.
      set addPath="%addPath:~9,-1%"
      svn add %addPath%
      
      :end
      

      【讨论】:

        【解决方案9】:
        for /f "usebackq tokens=2*" %%i in (`svn status ^| findstr /r "^\?"`) do svn add "%%i %%j"
        

        在此实现中,如果您的文件夹/文件名有多个空格,如下所示:

        "C:\PROJECTS\BACKUP_MGs_via_SVN\TEST-MG-10\data\destinations\Sega Mega      2"
        "C:\PROJECTS\BACKUP_MGs_via_SVN\TEST-MG-10\data\destinations\One space"
        "C:\PROJECTS\BACKUP_MGs_via_SVN\TEST-MG-10\data\destinations\Double  space"
        "C:\PROJECTS\BACKUP_MGs_via_SVN\TEST-MG-10\data\destinations\Single"
        

        这种情况由简单的:

        for /f "usebackq tokens=1*" %%i in (`svn status ^| findstr /r "^\?"`) do svn add "%%j"
        

        【讨论】:

          【解决方案10】:

          如果您使用 Linux 或在 Windows 中使用 Cygwin 或 MinGW,您可以使用类似 bash 的解决方案,如下所示。与这里介绍的其他类似的相比,这个考虑了文件名空间:

          svn status| grep ^? | while read line ; do  svn add "`echo $line|cut --complement -c 1,2`" ;done
          

          【讨论】:

          • 这是干什么用的?命令?重击?它看起来像 Bash(或类似的外壳)。在这种情况下,它假定 Linux 或类似的(例如 MinGWCygwin)。 OP 声明:“我的服务器运行的是 Windows Server 2003,因此无法使用 Unix 解决方案。”
          • 谢谢,你是对的,当我在 Windows 中时,我使用 Cygwin 和 Bash。但是,“我的服务器运行的是 Windows Server 2003,因此 Unix 解决方案无法运行”的声明。是假的。也许他不想使用 Cygwin 或 MinGW,但他没有那样表达自己。我重新制定了回应。
          【解决方案11】:

          此方法应处理其中包含任意数量/组合空格的文件名...

          svn status /home/websites/website1 | grep -Z "^?" | sed s/^?// | sed s/[[:space:]]*// | xargs -i svn add \"{}\"
          

          下面是对该命令作用的解释:

          • 列出所有更改的文件。
          • 将此列表限制为带有“?”的行在开始 - 即新文件。
          • 删除“?”行首的字符。
          • 删除行首的空格。
          • 将文件名输入 xargs 以多次运行 svn add。

          使用 xargs 的 -i 参数来处理能够将带空格的文件名导入 'svn add' - 基本上,-i 将 {} 设置为用作占位符,因此我们可以将 " 字符放在使用的文件名周围通过'svn add'。

          这种方法的一个优点是它可以处理带有空格的文件名。

          【讨论】:

          • 这假定 Linux 或类似的(例如 MinGWCygwin)。 OP 声明:“我的服务器运行的是 Windows Server 2003,因此无法使用 Unix 解决方案。”
          【解决方案12】:

          TortoiseSVN 内置此功能,如果您愿意使用非命令行解决方案。只需右键单击顶级文件夹并选择添加...

          【讨论】:

          • 大型存储库 TortoiseSVN 挂起。这让我寻找命令行替代品:-)
          【解决方案13】:

          这是在 svn book 上记录的,最简单,对我来说非常完美

          svn add * --force
          

          http://svnbook.red-bean.com/en/1.6/svn.ref.svn.c.add.html

          【讨论】:

            【解决方案14】:

            用途:

            svn st | grep ? | cut -d? -f2 | xargs svn add
            

            【讨论】:

            • 或者你可以使用 cut 来完成 grep 的工作:svn status | cut -d ? -f 2 -s | xargs svn add
            • 这假定 Linux 或类似的(例如 MinGWCygwin)。 OP 声明:“我的服务器运行的是 Windows Server 2003,因此无法使用 Unix 解决方案。”
            【解决方案15】:

            在花了一些时间试图弄清楚如何递归地只添加一些文件之后,我认为分享对我有用的东西是有效的:

            FOR /F %F IN ('dir /s /b /a:d') DO svn add --depth=empty "%F"
            FOR /F %F IN ('dir /s /b /a *.cs *.csproj *.rpt *.xsd *.resx *.ico *.sql') DO svn add "%F"
            

            这里有一些解释。

            第一个命令添加所有目录。第二个命令只根据指定的模式添加文件。

            让我提供更多细节:

            • FOR:你知道,循环控制。
            • /F:表示获取文件和目录(不确定)。
            • %F:它是一个变量;它将一次假定每个列出的文件的值;它可以有另一个单字符名称。
            • IN:不用解释了吧?
            • ('dir /s /b /a:d'):将列出目录的 DOS 命令;在我的例子中 /s 是递归的, /b 是只取完整路径, /a:d 只表示目录;根据需要更改它,保留括号和撇号。
            • DO: 表示命令中接下来会为每个目录执行的内容
            • svn add --depth=empty:这是需要运行的SVN突击队;深度定义意味着只添加目录而不是其中的文件。
            • “%F”:这就是你使用前面定义的变量的方式。

            在第二个命令中,唯一的区别是dir命令和svn命令,我觉得已经很清楚了。

            【讨论】:

              【解决方案16】:

              我想我做过类似的事情:

              svn add . --recursive
              

              但不确定我的记忆是否正确;-p

              【讨论】:

              • 只是为了你的记忆而更新:svn 1.4 和 1.5 不支持 --recursive 作为 svn add 的参数 :)
              【解决方案17】:

              在 Linux 上可以输入以下命令:

              find ./ -name "*." | xargs svn add
              

              【讨论】:

                【解决方案18】:

                由于他指定了 Windows,awk 和 sed 不是标准的:

                for /f "tokens=1*" %e in ('svn status^|findstr "^\?"') do svn add "%f"
                

                或在批处理文件中:

                for /f "tokens=1*" %%e in ('svn status^|findstr "^\?"') do svn add "%%f"
                

                【讨论】:

                  【解决方案19】:

                  这是用 SVN 同步目录(包括新文件)的一种既懒惰又危险的方法:

                  svn rm --keep-local dir
                  svn add dir
                  

                  虽然这可以在紧要关头发挥作用,但也可能产生严重后果。例如,SVN 经常会丢失文件历史记录。

                  同步目录的理想方法是先进行 diff,然后使用 svn patch,但这与 diff 命令中的格式不同,svn diff 命令将比较工作目录的差异,而不是文件系统级别的差异。

                  【讨论】:

                    猜你喜欢
                    • 2012-10-05
                    • 1970-01-01
                    • 2015-12-18
                    • 1970-01-01
                    • 1970-01-01
                    • 2023-03-06
                    • 2020-05-30
                    • 2014-09-05
                    • 1970-01-01
                    相关资源
                    最近更新 更多