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

Posted

技术标签:

【中文标题】如何自动删除 Mercurial 工作树中的所有 .orig 文件?【英文标题】:How to automatically remove all .orig files in Mercurial working tree? 【发布时间】:2010-11-07 05:59:36 【问题描述】:

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

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

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

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

更新:

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

【问题讨论】:

我更喜欢“打开~/.hgrc”这样的答案,例如转到“扩展”部分并添加“no-orig”插件......一厢情愿? 【参考方案1】:

我个人使用

$ rm **/*.orig

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

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

$ hg purge

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

$ hg purge --all

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

【讨论】:

rm 很短:)。但是清除会删除所有未跟踪的文件 - 我使用的一些文件没有被故意跟踪 - 私有项目配置、数据库配置等...... 为什么我会为此投反对票?是因为这只适用于像 Zsh 这样理解 ** 的 shell?我说的是个人,因为这是我自己使用的,然后我以清除扩展的形式给出了一个通用的跨平台答案。 @Martin 我猜它不会递归到子目录中。 @Keyo:rm 命令行确实是递归的,这就是** 部分的目的。它不会删除删除.orig 文件后变为空的目录。这是使用hg purge 的一个小优势。我的项目中很少有目录来来去去,所以我以前没有想到这一点。【参考方案2】:

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

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

【讨论】:

【参考方案3】:

如果您只是想删除 .orig 文件,并且您恰好在 Windows 计算机上,那么以下方法似乎可以正常工作:

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

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

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

【讨论】:

如果您安装了 purge,我同意这是最好的选择【参考方案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;'

【讨论】:

通过多个流程的管道如何比find . -name '*.orig' -exec rm '' ';' 甚至更简单的find . -name '*.orig' -delete 更好,所有工作都由findrm 直接或仅由find 执行拥有? @Mecki,很确定不是,而且当文件包含奇怪的字符时很容易出错......例如换行符。【参考方案5】:

你应该使用update hook

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

【讨论】:

你能更具体一点吗?您是否建议删除提交挂钩上的所有文件? :) 你可以执行 find 。 -iname '.orig' -exec rm '' ';' *合并后,详情见文档【参考方案6】:

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

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

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

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

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

希望这有帮助。

【讨论】:

【参考方案7】:

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

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

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

解释:

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

【讨论】:

如果我在这里错了,请纠正我,但是当您在不使用 -0 标志的情况下将输出发送到 xargs 时,这不会出现您遇到的所有常见问题吗?从手册页:“-0 Input items are terminated by a null character instead of by whitespace, and the quotes and backslash are not special (every character is taken literally). Disables the end of file string, which is treated like any other argument. Useful when input items might contain white space, quote marks, or backslashes. The GNU find -print0 option produces input suitable for this mode." @mlissner,你是对的。就我而言,我们通常不会在文件名中添加空格或换行符,因此对于一般情况,上述解决方案不起作用。【参考方案8】:

我在 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 ;

【讨论】:

【参考方案9】:

PowerShell 单行(递归):

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

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

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

【讨论】:

【参考方案10】:

这不是删除多余文件的自动方式,但手动运行很简单。

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`

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

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

【讨论】:

【参考方案11】:

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

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

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

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

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

【讨论】:

【参考方案12】:

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

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

适用于 Mac 和 *nix

【讨论】:

这不是一个好的答案:带空格的文件名会破坏rm 调用。如果您修复了答案,请告诉我,以便我可以删除反对票。 你需要在变量$f周围加上双引号""。这是许多对文件和目录进行操作的脚本中的常见问题,包括 Apple 文档(我在几年前通知他们更新并且仍然有不兼容的脚本示例):P @MartinGeisler 已修复! :) @CollinKlopfenstein:假设您有名为foo.txtbar baz.txt 的文件。 find 调用将返回 foo.txt\nbar baz.txt\n,for 循环会将其拆分为 三个 文件:foo.txtbarbaz.txt。只有名字是正确的。这就是为什么你需要find -print0 或者应该让find 执行rm 通过多个流程的管道如何比find . -name '*.orig' -exec rm '' ';' 甚至更简单的find . -name '*.orig' -delete 更好,其中所有工作都由findrm 直接或仅由find 执行拥有?

以上是关于如何自动删除 Mercurial 工作树中的所有 .orig 文件?的主要内容,如果未能解决你的问题,请参考以下文章

Mercurial/Meld 中的 3 路合并如何工作?

如何使用决策树中的 feature_importances_ 删除所有非零重要特征?

如何撤消 Mercurial 中所有添加的文件

如何获取包含 Mercurial 中特定修订的所有分支的列表?

如何从当前 Git 工作树中删除本地(未跟踪)文件

Mercurial 中止:索引 ... 已损坏