我的mercurial存储库中有两个分支,它们具有相同的.hgignore文件:dir/
一个分支(开发)应该忽略这个目录,而另一个分支(发布)应该而不是忽略它。我知道我可以使用hg add dir/somefile
,尽管.hgignore文件中有条目。但现在我想递归地添加整个目录。
我搜索并尝试
hg add dir # does not add anything
hg add dir* # does not add anything
hg add dir/ # does not add anything
hg add dir/* # only adds the files in dir but not in sub-directories
hg add dir/** # only adds the files in dir but not in sub-directories
但这不能递归地工作。我可以用add dir/* dir/*/* dir/*/*/*
等等,但那很烦人。有没有别的通配符或者别的方法来完成这个?
PS:我想避免更改。hgignore.
与此同时,我想出了一个似乎是一个解决方案:
hg add --dry-run --verbose `hg status --ignored --no-status --exclude **.DS_Store dir/`
这显示了它要添加的文件列表。如果你真的想添加它们,使用下面的命令:
hg add `hg status --ignored --no-status --exclude **.DS_Store dir/`
如果您可以访问find
,则可以执行以下操作:
find docs -exec hg add {} ;
无论何时使用find运行命令,最好先做一次演练,所以我通常先在命令前面加上一个echo
:
find docs -exec
echo
hg add {} ;
如果您需要添加足够的文件,而性能是一个问题,您可以使用+
而不是;
,它将把所有匹配的文件名附加到同一个命令中,而不是为每个文件名运行一次命令。对于hg add
来说,这可能不是一个问题,但对于理解find
是如何工作的很重要。
find docs -exec hg add {}
+
不幸的是,.hgignore
将忽略任何不是文件完整路径的内容,即使在评估模式时也会考虑。在StackExchange上有一篇文章,其中包含您可以使用的替代方案(假设您不想更改.hgignore
)