57

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

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

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

并给它起别名或其他东西,但我宁愿使用 hg cleanup 之类的东西......

更新:

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

4

12 回答 12

70

就个人而言,我使用

$ rm **/*.orig

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

但是,如果您使用另一个 shell 或想要一个内置的解决方案,那么也许您会喜欢purge 扩展(链接更新于 2016-08-25)。这使您可以删除所有未跟踪的文件

$ hg purge

您可以删除所有未跟踪和忽略的文件

$ hg purge --all

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

于 2009-07-01T08:19:34.197 回答
34

顺便提一句。find实用程序有一个操作-delete ,因此您只能键入:

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

于 2012-11-12T11:18:50.790 回答
15

如果您只想删除 .orig 文件,而您恰好在 Windows 计算机上,则以下操作似乎效果很好:

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

这将删除所有以 .orig 结尾的未跟踪文件,但不会像其他答案那样删除其他未跟踪文件。

您也可以在运行之前通过放入--print标志来测试它。

于 2012-11-14T21:35:04.027 回答
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;'
于 2012-03-11T21:15:46.903 回答
1

你应该使用更新钩子

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

于 2009-07-01T07:31:08.787 回答
1

之前已经发布过这个答案。但这是这个答案的正确位置。

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

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确认删除文件【安全机制】

希望这会有所帮助。

于 2012-11-23T12:40:20.590 回答
1

我个人从 repo 的根目录中使用以下内容:

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

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

解释:

  • -p 参数打印要清除的文件列表
  • -I 参数白名单过滤要包含的文件
  • 结果列表通过管道传送到 xargs 并使用 rm -f 命令执行
于 2013-07-11T12:48:46.810 回答
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 ;
于 2015-07-09T21:50:10.840 回答
1

PowerShell 单行(递归):

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

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

Get-ChildItem . -Recurse -File -Include *.orig | Remove-Item
于 2020-05-04T07:55:12.017 回答
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`

如果您留下了空目录,则-rand-d标志rm可能会有所帮助。

作为奖励hg status --ignored可以用来清理所有那些被忽略的临时文件以及从你的编辑器(例如,Vim)交换文件。

于 2014-09-29T00:12:05.357 回答
0

我在 Linux 上使用的一个用于清理的命令,省去了使用 find 重新搜索的需要。

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

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

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

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

于 2015-12-01T22:02:50.907 回答
-1

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

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

适用于 Mac 和 *nix

于 2012-01-19T20:02:25.637 回答