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

77

我正在使用一个ORM,它通过CLI生成大量文件。 有没有一种简单的方法在运行svn status命令时,对于目录内出现的所有以?形式显示的文件,运行svn add操作?

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


@your edit: 那么,请提供添加多个路径的方式,例如:svn add dir1/* dir2/* dir3/*,或者像许多人提到的那样,从根目录中使用grep命令筛选svn stat的输出,并将其传递给cutawk来进行添加操作。 - prodigitalson
如果您使用的是Windows系统,您可以随时使用TortoiseSVN来简化操作。 - Brian Ogden
15个回答

162

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

svn add --force path/to/dir

这将会把当前目录及其子目录下所有未被忽略的文件全部添加:

svn add --force .

6
+1 - 这似乎是最正确的。我将删除我的原始答案。 - Joshua McKinnon
1
当我使用第二个命令时,仍然会忽略添加的文件夹和文件。 - Christopher Bonitz

70

供参考,问题非常相似。

我发现这些方法对我最有效。它们也适用于包含空格的文件名,并且不会重新添加被忽略的文件。我没有在其他答案中看到它们。

添加:

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

移除:

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

编辑:如果你想保留被忽略的文件,重要的是不要使用“add *”,否则所有被忽略的文件将会被重新添加。


这将在遇到带有空格的文件名时出现问题吗?(许多基于svn stat的解决方案都存在类似的问题) - tobixen
1
svn st | grep ^? | sed 's/? *//' | xargs -d'\n' svn add # <- 适用于带空格的文件名 - tobixen
在MacOS X上,对于路径中包含空格的情况似乎会出现问题。遗憾的是,MacOS附带的xargs似乎不接受-d标志。 - amacleod
我使用这种方法,因为它是最好的。尽管我评论了另一个人的答案,但那个答案非常相似。 - Grapho
1
你可以使用 awk {'print $2'} 替代 sed 's/? //' - Jijo
显示剩余6条评论

34

你只需执行 svn add path/to/dir/* 命令,会收到任何已在版本控制中的警告,但它将添加所有未被版本控制的文件。


34
如果你有被忽略的文件,你真的不应该这样做,因为它会重新添加它们。 - phazei
8
通常,命令 svn add * 会跳过任何已经处于版本控制下的目录。然而有时候你可能想要添加工作副本中所有未版本化的对象,包括那些更深层次的。传递 --force 选项会使 svn add 递归进入已经版本化的目录。 - ilmatte

11
svn status | grep "^\?" | awk '{print $2}' | xargs svn add

这段代码来自某个网站,不过我已经使用它一段时间了,效果很好。


@phazei的回答更加完整 (https://dev59.com/bnI95IYBdhLWcg3w2h56#3662677) - Alexander Bird
我更喜欢这个版本,而不是@phazei的版本,因为这个版本使用了awk并且免除了你计算空格的麻烦。 - Alex Che

6
如果 svn add whatever/directory/* 无法工作,您可以采用困难的方式:
svn st | grep ^\? | cut -c 2- | xargs svn add

我推荐这个shell“脚本”。点赞。 - Jerry Switalski

4

解决方案

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

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

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

(似乎在我的系统上前导空格的数量不同——只需调整即可。)

我使用这种方法。它似乎是最好的,并且将合法地添加适当的文件,而不是不加选择地强制添加所有文件。谢谢! - Grapho

4

您应该能够运行:

svn add *

它可能会抱怨已经在版本控制下的文件,但它也会添加新文件。不过你可能需要考虑一下是否真的想把这些生成的文件加入版本控制。它们可以被视为派生工件,就像编译后的代码一样,因此不应该添加。当然,这取决于你,但这是一个值得思考的问题。

3
svn add *

应该能够完成这项工作。只需确保以下几点:
svn commit

之后 :)

2
在Alpine Linux操作系统上,我使用了以下方法,这是基于其他人的答案:
svn st | grep ^? | sed 's/? *//' | xargs -I fn svn add "fn"

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上似乎可以工作(包括带有空格的文件)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接