2011-07-11 21 views
6

我做了一個hg mv -A oldFile newFile並意外地弄錯了新文件。撤銷mercurial中的移動/重命名操作?

我做了一個hg revert newFile但現在顯示爲丟失(然後在移動命令後移除)的文件現在不再顯示出來。

我該如何撤銷並回到我所處的狀態,以便新文件顯示爲未知並且舊文件顯示爲缺失?

回答

7
$ hg st 
$ mv a b 
$ hg st 
! a 
? b 
$ hg mv -A a b 
$ hg st 
A b 
R a 
$ hg revert b 
$ hg st 
? b 
$ ls 
a b 

所以hg revert b恢復舊文件a。現在你所要做的就是hg mv a correct-name

+0

謝謝!並不認爲它會恢復刪除舊文件。 –

+0

由於最後一個'ls'顯示,名爲「b」的文件仍然存在,所以原來的問題還沒有完全回答。使用這裏說明的技術,文件「b」將不得不手動刪除。當然,在給定的情況下,如果原始的'mv a b'已經破壞了b,那麼b就消失了。更有理由使用'hg mv'代替。 – peak

0

這是一個用bash寫的「unmove」腳本。頂部有一些幫助文字。最重要的一點是,該腳本有一個選項,強制任何文件刪除交互。

#!/bin/bash 

# Syntax: $0 [OPTION] DEST 
# 
# This script is mainly intended to undo the effects of: hg move SOURCE DEST 
# 
# It first determines which files have been added globally (as if by 
# hg add), then it runs: 

# hg -v revert DEST 

# Finally, it removes all the files that had been added, 
# and then reverts them as well if possible. 
# 
# OPTIONS: 
# -i :: remove files using rm -i 

if [ "$1" = -i ] ; then 
    INTERACT=$1 
    shift 
fi 


TODO=() 
while read -r f ; do 
    TODO+=("$f") 
done < <(hg st -an "[email protected]") 

function go { 
    hg -v revert "[email protected]" 
    for f in "${TODO[@]}" ; do 
     rm $INTERACT "$f" 
     hg -q files "$f" > /dev/null && hg revert "$f" 
    done 
} 

go