如何自动删除Mercurial工作树中的所有.orig文件?

时间:2009-07-01 07:10:21

标签: mercurial dvcs purge

在合并期间,mercurial会为任何未解析的文件留下.orig文件。但在手动解决问题并将文件标记为正确后,它不会删除.orig文件。是否可以通过某些命令自动删除?

我在Mac上工作,所以我可以使用类似的东西:

find . -iname '*.orig' -exec rm '{}' ';'

和别名,但我更喜欢使用hg cleanup ......

更新:

从现在开始,Purge extension与Mercurial捆绑在一起,很好地解决了这个问题。

12 个答案:

答案 0 :(得分:66)

就个人而言,我使用

$ rm **/*.orig

如果我厌倦了.orig文件。运行shopt -s globstar后,这在Zsh和Bash 4中有效。

但是如果您使用其他shell或想要内置解决方案,那么您可能会喜欢purge extension(链接已更新2016-08-25)。这允许您使用

删除所有未跟踪的文件
$ hg purge

您可以使用

删除所有未跟踪和忽略的文件
$ hg purge --all

使用hg purge的一个优点是,这也将清除删除文件后变为空的目录。 rm命令行只会留下空目录。

答案 1 :(得分:31)

顺便说一句。 find实用程序有一个操作-delete 所以你只能输入:

find <path-to-files> -name '*.orig' -delete

答案 2 :(得分:13)

如果你只想删除.orig文件,而你碰巧在Windows计算机上,以下似乎运作良好:

D:\workspace>hg purge -I **/*.orig --all

这将删除以.orig结尾但未删除其他未跟踪文件的所有未跟踪文件,如其他答案所示。

您可以在运行它之前测试它,方法是同时放入--print标志。

答案 3 :(得分:4)

以下内容将删除整个工作副本层次结构中的.orig文件,也适用于包含空格的路径:

find . -name *.orig | while read -d $'\n' file; do rm -v "$file"; done;

我在.bash_profile中使用别名:

alias clearorig='echo "Removing .orig files..."; find . -name *.orig | \
while read -d $'\''\n'\'' file; do rm -v "$file"; done;'

答案 4 :(得分:1)

您应该使用update hook

  

更新:在工作目录的更新或合并完成后运行

答案 5 :(得分:1)

我已发布此答案before。但这是这个答案的正确位置。

我自己制作了这个批处理文件。

IF "%1%" == "d" (
    del /s *.orig
    del /s *.rej
 ) ELSE ( 
    del /s /p *.rej
    del /s /p *.orig
 )

帮助: 将此内容保存为 orig.bat

  1. 运行 orig d ,一次删除所有拒绝和原始文件,无需确认
  2. 运行 orig 以删除确认[安全机制]
  3. 的文件

    希望这有用。

答案 6 :(得分:1)

我个人在回购的根目录中使用以下内容:

hg purge -p -I **/*.orig | xargs rm -f

这比使用'hg purge'或'hg purge --all'要好一些,因为你可以过滤掉你想要包含的特定文件类型。

解释:

  • -p参数打印要清除的文件列表
  • -I参数白名单过滤要包含的文件
  • 结果列表通过管道传输到xargs并使用rm -f命令执行

答案 7 :(得分:1)

我在Powershell工作,但在这里没有看到答案:

# NOTE: be in the root of your repository
# fetch all .orig files recursively
$orig = (dir *.orig -recurse) ;

# remove each .orig file
foreach ($item in $orig) { del $($item.FullName) ; }

# afterwards I make sure to remove the references to the .orig files in the repo
# then commit & push
hg addremove ; 
hg commit -m "remove .orig" ;
hg push ;

答案 8 :(得分:1)

PowerShell一线式(递归):

Get-ChildItem <path> -Recurse -File -Include *.orig | Remove-Item

例如当前文件夹和子文件夹:

Get-ChildItem . -Recurse -File -Include *.orig | Remove-Item

答案 9 :(得分:0)

这不是删除额外文件的自动方式,但它非常简单,可以手动运行。

hg st可以显示未知未跟踪的文件。您可以将此输出用作系统rm命令的参数。这是我刚刚执行的一个实际例子:

$ # SHOW ONLY THE CRUFT
$ hg status --unknown
? config/settings.rb.orig
? lib/helpers.rb.orig
? routes/main.rb.orig

$ # THE CRUFT WITHOUT THE "?" PREFIX
$ hg status --unknown --no-status
config/settings.rb.orig
lib/helpers.rb.orig
routes/main.rb.orig

$ # SAFELY REMOVE ALL CRUFT
$ rm -- `hg st -un`

如果您遗留了空目录,-r的{​​{1}}和-d标记可能会有所帮助。

作为奖励rm可用于清除所有被忽略的临时文件以及从编辑器交换文件(例如,Vim)。

答案 10 :(得分:0)

我在Linux上用于清理的命令,无需使用find进行全新搜索。

这些需要从Mercurial项目的根目录运行

hg status | grep ".orig" | cut -d ' ' -f 2- | xargs rm -f

或者如果您想清除所有未知文件。

hg status | cut -d ' ' -f 2- | xargs rm -f

答案 11 :(得分:-1)

我不喜欢所选择的答案。它不会删除项目所有级别中的所有内容。我用这个:

for f in `find . | grep .orig$`; do rm "$f"; done

适用于Mac和* nix