How to automatically remove all .orig files in Mercurial working tree?


Mercurial Problem Overview

During merges mercurial leaves .orig file for any unresolved file. But after manually resolving problems and marking a file correct it does not delete the .orig file. Can it be automatically removed by some command?

I work on a Mac so I can use something like:

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

and alias it or something, but I'd rather use something like hg cleanup...


Since some time now, Purge extension is bundled with Mercurial and solves this problem nicely.

Mercurial Solutions

Solution 1 - Mercurial

Personally, I use

$ rm **/*.orig

if I get tired of the .orig files. This works in Zsh and in Bash 4 after you run shopt -s globstar.

But if you use another shell or want a built-in solution, then maybe you'll like the purge extension (link updated 2016-08-25). That lets you remove all untracked files with

$ hg purge

You can remove all untracked and ignored files with

$ hg purge --all

An advantage of using hg purge is that this will also cleanup directories that become empty after removing the files. The rm command line will just leave the empty directories behind.

Solution 2 - Mercurial

btw. find utility has an action -delete so you can type only:

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

Solution 3 - Mercurial

If you just want to delete the .orig files, and you happen to be on a Windows computer, the following seems to work well:

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

This will delete all untracked files that end in .orig, but won't delete other untracked files, as the other answers would.

You can test this before running it by putting the --print flag in as well.

Solution 4 - Mercurial

The following will remove .orig files in your entire working copy hierarchy and also works for paths containing spaces:

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

I use an alias in my .bash_profile:

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

Solution 5 - Mercurial

you should use the update hook

> update: This is run after an update or merge of the working directory has finished

Solution 6 - Mercurial

I have posted this answer before. But this is the correct place to this answer.

I made this batch file myself.

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

Help: Save this content as orig.bat

  1. Run orig d to delete all rejects and orig files at once without confirmation

  2. Run orig to delete files with confirmation [Safety mechanism]

Hope this is helpful.

Solution 7 - Mercurial

I personally use the following from the root of the repo:

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

It's a little better than using just 'hg purge' or 'hg purge --all' because you can filter out the specific file types you want to include.

For an explaination:

  • The -p argument prints the list of files to be purged
  • The -I argument whitelist filters the files to include
  • The resulting list is piped to xargs and executed using the rm -f command

Solution 8 - Mercurial

I'm working in Powershell and didn't see the answer here:

# 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 ;

Solution 9 - Mercurial

PowerShell one-liner (recursive):

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

For example for the current folder and sub-folders:

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

Solution 10 - Mercurial

This is not an automatic way of removing extra files, but it's simple enough to run manually.

The hg st can show unknown or not tracked files. You can use this output as an argument to the system rm command. Here's an actual example I just performed:

$ hg status --unknown
? config/settings.rb.orig
? lib/helpers.rb.orig
? routes/main.rb.orig

$ hg status --unknown --no-status

$ rm -- `hg st -un`

If you have empty directories left behind, the -r and -d flags for rm might help.

As a bonus, hg status --ignored could be used to cleanup all those ignored temp files as well as swap files from your editor (e.g., Vim).

Solution 11 - Mercurial

A command that I use on Linux for cleaning up, saves the need to do a fresh search with find.

These need to be run from the root directory of the Mercurial project

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

Or if you want to clear all unknown files.

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

Solution 12 - Mercurial

I don't like the chosen answer. It doesn't removed everything within all levels of the project. I use this:

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

Works on both Mac and *nix


All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionrkjView Question on Stackoverflow
Solution 1 - MercurialMartin GeislerView Answer on Stackoverflow
Solution 2 - MercurialvectorocView Answer on Stackoverflow
Solution 3 - MercurialmlissnerView Answer on Stackoverflow
Solution 4 - MercurialmccrappyView Answer on Stackoverflow
Solution 5 - MercurialdfaView Answer on Stackoverflow
Solution 6 - MercurialMahendranView Answer on Stackoverflow
Solution 7 - MercurialGaryView Answer on Stackoverflow
Solution 8 - MercurialsonjzView Answer on Stackoverflow
Solution 9 - MercurialhamapaView Answer on Stackoverflow
Solution 10 - MercurialClint PachlView Answer on Stackoverflow
Solution 11 - Mercurialtoddles_fpView Answer on Stackoverflow
Solution 12 - MercurialCollin KlopfensteinView Answer on Stackoverflow