如何将所有新文件添加到SVN


67

我正在使用从CLI生成大量文件的ORM。有没有一种简单的方法可以svn add在目录中的所有文件上运行它们,就像?我运行时一样svn status

编辑 这些文件存在于目录树中,因此*无法添加一个目录。


@your edit:因此,请提供多个添加路径,例如:svn add dir1/* dir2/* dir3/*或有许多提到根目录grep的输出svn stat并将其通过管道传递到cutor awk,然后添加。
prodigitalson

如果您使用的是Windows,则始终可以使用TortoiseSVN来简化生活。
Brian Ogden 2013年

Answers:


30

您可以这样做,svn add path/to/dir/*就会收到有关版本控制中已有内容的警告,但会添加所有未包含的内容。


33
如果您忽略了文件,您确实不想这样做,因为它将重新添加文件。
phazei

7
svnbook.red-bean.com/en/1.6/svn.ref.svn.c.add.html- >“通常,命令svn add *将跳过已经受版本控制的所有目录。但是,有时,您可能想在工作副本中添加每个未版本控制的对象,包括隐藏得更深的对象。传递--force选项可使svn将递归添加到版本化目录中”
ilmatte 2014年

148

这将在指定的目录树下添加所有未知(忽略的文件)文件:

svn add --force path/to/dir

这将在当前目录及以下目录中添加所有未知(忽略的文件)文件:

svn add --force .

6
+1-这似乎是最正确的。我要删除原始答案。
约书亚·麦金农

1
使用第二个命令时,我仍然会添加忽略的文件夹文件。
Christopher Bonitz

68

供参考,这些 非常相似的问题。

这些似乎最适合我。它们也可以使用空格,并且不会重新添加忽略的文件。我没有在看到的其他答案中列出它们。

添加:

svn st | grep ^? | sed 's/?    //' | xargs svn add

删除:

svn st | grep ^! | sed 's/!    //' | xargs svn rm

编辑:如果要保留忽略的文件,请不要使用“添加*”,这一点很重要,否则所有被忽略的内容都会重新添加。


在遇到带空格的文件名之前,这将很好地工作?(许多基于svn stat的建议解决方案都存在类似问题)
tobixen

1
svn st | grep ^?| sed的/?* //'| xargs -d'\
n'svn

在MacOS X上,对于其中带有空格的路径,这似乎不起作用。可悲的xargs是,MacOS附带的似乎不接受该-d标志。
amacleod

我为此创建了一个脚本:gist.github.com/nestserau/ab7d48e857811e1ef808
Aleks N.

1
而不是sed 's/? //'您可以使用awk {'print $2'}
Jijo



4

解决方案

svn status | grep ^? | sed 's/?    //' | xargs svn add

不适用于空格。相反,可以使用

svn status | grep ^? | sed 's/^?       //' | xargs -I fn svn add "fn"

(似乎在我的系统上,前导空白的数量不同-只需对其进行调整即可)。


我用这种方法。似乎工作得最好,并且会合法地添加适当的文件,而不是强加于强迫所有文件的添加。谢谢!
Grapho 2015年

3

您应该能够运行:

svn add *

它可能会抱怨已经在版本控制下的文件,但也会添加新文件。

不过,您可能要考虑是否真的要将这些生成的文件添加到版本控制中。它们可以被认为是派生的工件,有点像已编译的代码,因此不应添加。当然,这取决于您,但是要考虑一下。



1

在像一样的贝壳中您可以使用**通配符来做到这一点:

svn add **

1
svn status | grep "^\?" | awk '{ printf("\""); for (f=2; f <= NF; f++) { printf("%s", $f); if (f<NF) printf(" "); } printf("\"\n");}' | xargs svn add

这是基于markb的答案...以及互联网上的一些狩猎活动。它看起来很丑陋,但是似乎可以在OS X(包括带空格的文件)上使用。


1

这将添加所有未版本控制的文件,即使它包含空格

svn状态| awk'{$ 1 =“”; 打印$ 0}'| xargs -i svn添加“ {}”


0

我喜欢这些svn status用于查找新文件或丢失文件的命令,这些命令尊重被忽略的文件。

svn add $( svn status | sed -e '/^?/!d' -e 's/^?//' )

svn rm $( svn status | sed -e '/^!/!d' -e 's/^!//' )

添加-e's / $ / @ /'还可以处理您的'@ 2x.png'和'@ 3x.png'文件
Andy Weinstein

0

在bash一线游戏中,我认为这是最漂亮的:

svn status | tee >(awk '/^?/{print $2}' | xargs -r svn add >&2) | awk '/^!/{print $2}' | xargs -r svn delete

它将添加所有新文件,并删除所有丢失的文件。谨慎使用,可能设置别名以快速访问。

对于Macs的注释:xargs中-r是GNU扩展:可能不受支持。在这种情况下,只要没有文件要添加或删除,只需将其删除并忽略警告即可


1
漂亮是一个主观的东西:-)
tobixen

0

我是svn版本控制的新手。但是,对于人们想要添加文件而不忽略已经设置的svn:ignore属性的情况,我解决了以下问题

  1. svn add --depth空路径/到/目录
  2. 从ignoreList.txt所在的位置执行“ svn propset svn:ignore -F ignoreList.txt --recursive”。在我的情况下,该文件位于我要添加的“ path / to / directory”上方的两个目录中。请注意,ignoreList.txt包含我希望svn忽略的文件扩展名,例如* .aux等。
  3. svn添加--force路径/到/目录/。

以上步骤有效。


0

在Alpine Linux OS上,我根据其他答案使用了此功能:

svn st | grep ^? | sed 's/? *//' | xargs -I fn svn add "fn"
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.